2011-02-02 47 views
5

有沒有辦法通過Style設置附屬屬性?WPF:我可以通過樣式定義/設置附加屬性嗎?

我有例如一個按鈕上互動的東西設置(從System.Windows.Interactivity)

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

現在我想就在這Interaction.Triggers屬性設置一個樣式,從而通過其指定屬性更換冗餘在每個Button實例上。這在WPF中可能嗎?

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

不知怎的,我不能看怎麼樣,但是我已經看到了網絡中的其他例子,其中附加屬性似乎從某種風格中進行訪問...

更新

所以基本上這是Interaction的一個問題。觸發器沒有辦法「設置」某些東西。我該如何重用一組交互定義?

+0

可能重複:http://stackoverflow.com/questions/4067876/set-hidden-attachedproperty-through-style – flq 2011-02-02 15:10:11

回答

8

這是一個只讀集合屬性(與InputBindings集合相同)的已知問題。爲了解決這個問題,我創建了一個附加屬性:

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()); 
     } 
    } 
} 

此屬性使用自定義StyleTriggerCollection,因爲標準的觸發器的集合沒有公共的構造函數:

public class StyleTriggerCollection : Collection<TriggerBase> 
{ 
} 

你可以用它喜歡的風格二傳手這樣的:

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

這看起來非常有前途,我會甲肝只要我回到代碼上就看一眼! – flq 2011-02-02 18:18:11

相關問題