为什么我不能在事件触发器中放置一个Setter

时间:2011-03-03 01:05:19

标签: .net wpf styles

我试图为支持拖放的列表框添加一些可视化反馈。好像我应该能够将一些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>

4 个答案:

答案 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?他们最终使用了故事板。它并不比安装者差。