【问题标题】:Trigger fires AFTER event handler触发器在事件处理程序之后触发
【发布时间】:2013-11-23 11:31:20
【问题描述】:

我的ToggleButton 使用StyleTrigger 来应用自定义的Template。代码如下:

<ToggleButton Checked="MyEvent">
    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Template" Value="{StaticResource OnTemplate}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

如您所见,ToggleButton 也会引发 Checked 事件,其处理程序会显示一个对话框。现在的问题是上述触发器仅在事件处理程序执行后触发。有没有办法将触发器优先于事件处理程序,以便应用模板并随后显示对话框?

【问题讨论】:

    标签: .net wpf xaml events triggers


    【解决方案1】:

    在为属性引发任何属性更改事件之前,首先执行路由事件。

    但是你可以通过invoking delegate asynchronously on dispatcher 实现这一点,这样你的template gets applied first -

    private void MyEvent(object sender, RoutedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)delegate { MessageBox.Show("Test String"); });
    }
    

    更新 -

    您可以将 DispatcherPriority 设置为较低的值 (DispatcherPriority.Input),以便触发器首先触发并在 UI 线程上休眠几分之一秒(不是好方法,但没有其他方法)。这将起作用 -

    Dispatcher.BeginInvoke((Action)delegate { Thread.Sleep(500);
                                              chkResultBoost.IsChecked = true; }, 
                                                 DispatcherPriority.Input);
    

    【讨论】:

    • 谢谢。我如何要求它在这里运行 IsChecked 触发器,而不是 MessageBox?我试过chkResultBoost.IsChecked = true;,但这似乎不起作用。
    • 也将其放入chkResultBoost.IsChecked = true; 委托中。不行吗?
    • 用另一种方法更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2012-04-15
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多