我试图为支持拖放的列表框添加一些可视化反馈。好像我应该能够将一些setter添加到EventSetter并完成。但是,事件排定器不支持setter。我是否真的必须制作一个故事板来实现这种行为?
微软对此的理性是什么?
<Style TargetType="{x:Type ListBox}">
<Style.Triggers>
<EventTrigger RoutedEvent="DragEnter">
<!--WHy Can't i Add seters here? e.g.
<Setter Property="ForeColor" Value="Red">
-->
</EventTrigger>
</Style.Triggers>
</Style>
答案 0 :(得分:7)
setter不仅设置属性以响应状态更改,还会在状态更改时将属性还原为其先前的值。使用事件触发器没有“改变”,所以使用setters就像把东西推到一个永远不会弹出的堆栈上。
我认为在这种情况下,一个更好的问题是“为什么不存在IsDragOver
财产?”
答案 1 :(得分:3)
你可以尝试这样的事吗?这是sorta-pseudo代码,我没有VS来测试它,但它应该工作。使用反射器,您应该能够对SetterAction进行反向工程,并且理论上使这个Setter的工作方式几乎完全相同。
<TextBox Text="ListBox" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragEnter" >
<behavior:SetterAction Property="ListBox.ForeColor" Value="Red"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
public class SetterAction : TargetedTriggerAction<FrameworkElement>
{
public DependencyProperty Property { get; set; }
public Object Value { get; set; }
protected override void Invoke(object parameter)
{
AssociatedObject.SetValue(Property, Value);
}
}
答案 2 :(得分:1)
你不能把setter放在eventtriggers中。多数民众赞成就是这样。如果你不介意在工作背后做一些代码,你就不需要故事板。其他有同样问题的人也不会感觉太糟糕。
退房 How to open a WPF Popup when another control is clicked, using XAML markup only?
答案 3 :(得分:1)
是的,很糟糕。同样的问题EventTrigger with Setter in WPF?他们最终使用了故事板。它并不比安装者差。