2011-02-02 20 views
5

Bir Stil'i bir Stil üzerinden ayarlamanın bir yolu var mı?WPF: Ekli bir özelliği bir stilde tanımlayabilir/ayarlayabilir miyim?

Ben örn. Bir düğme hangi Etkileşim şeyler üzerinde ben böylece o mülkü belirtmek zorunda tarafından fazlalıklar yerine Interaction.Triggers özelliği ayarlanmış olduğunu hangi bir stil yapmak istiyorum Şimdi

<Button> 
    <i:Interaction.Triggers> 
    ... 
    </i:Interaction.Triggers> 
</Button> 

(System.Windows.Interactivity itibaren) ayarlanır her Button örneğinde. Bu WPF'de mümkün mü? Her nasılsa

<Style Target={x:Type Button}> 
    <!-- ??? --> 
    <Setter PropertyName="i.Interaction.Triggers"> 
    ... 

nasıl göremezler, ama ekli özellikleri bir stil içinden erişilebilir olduğu görülüyor web diğer örneklerini gördük ...

Güncelleme

Yani Temelde bu bir şey "Set" için bir yolu olmayan Interaction.Triggers ile bir konudur. Bir Etkileşim tanımları kümesini yeniden nasıl kullanmalıyım?

+0

olası yinelenen: http://stackoverflow.com/questions/4067876/set-hidden-attachedproperty-through-style çok umut verici görünüyor – flq

cevap

8

Bu salt okunur toplama özellikleriyle bilinen bir sorundur (InputBindings koleksiyonuyla aynı şey). Bu sorunu çözmek için ben iliştirilmiş bir özellik oluşturduk:

public static StyleTriggerCollection GetTriggers(DependencyObject obj) { 
    return (StyleTriggerCollection)obj.GetValue(TriggersProperty); 
} 

public static void SetTriggers(DependencyObject obj, StyleTriggerCollection value) { 
    obj.SetValue(TriggersProperty, value); 
} 

public static readonly DependencyProperty TriggersProperty = 
    DependencyProperty.RegisterAttached("Triggers", typeof(StyleTriggerCollection), typeof(ControlExtensions), new UIPropertyMetadata(null, OnTriggersChanged)); 

static void OnTriggersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    var triggers = (StyleTriggerCollection) e.NewValue; 

    if (triggers != null) { 
     var existingTriggers = Interaction.GetTriggers(d); 

     foreach (var trigger in triggers) { 
      existingTriggers.Add((TriggerBase)trigger.Clone()); 
     } 
    } 
} 

standart tetik koleksiyon değil public kurucu bulunduğundan bu özellik, özel StyleTriggerCollection kullanır: Eğer gibi kullanabilirsiniz Stil pasör

public class StyleTriggerCollection : Collection<TriggerBase> 
{ 
} 

Bu:

<Setter Property="my:ControlExtensions.Triggers"> 
    <Setter.Value> 
     <my:StyleTriggerCollection> 
      <!-- Put your triggers here --> 
     </my:StyleTriggerCollection> 
    </Setter.Value> 
</Setter> 
+0

, ben hav edeceğiz e kodu geri döndüğümde bir bakış! – flq

+1

Bu işe yarıyor gibi görünüyor, ancak tetikleyicilerde DataContext kullanmak konusunda kafam karıştı. Çalışmak için RelativeSource AncestorType vb almak için görünmüyor olabilir ... – flq

+0

Göreceli kaynağın nasıl çalıştığını anlamak gerekir. Görsel ağaçta bulunan elemanlar üzerinde çalışır. Bu durumda, tetikleyiciler görsel ağaçta değil - tetikleyiciler koleksiyonu, görsel ağaçtaki bir öğenin bir özelliğidir. Bu bağlamda veri bağlamı kalıtımının çalışmasının nedeni, Tetikleyicilerin Dondurulabilir olarak devralmasıdır. Burada okuyabilirsiniz: http://drwpf.com/blog/category/freezables/ –

İlgili konular