2011-02-02 46 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

相关问题