有没有办法通过Style设置附加属性?
我有例如设置交互内容的按钮(来自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.Triggers没有办法“设置”某事的问题。我该如何重用一组交互定义?
答案 0 :(得分: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>