触发器在事件处理程序之后触发

时间:2013-11-11 15:39:11

标签: .net wpf xaml events triggers

我的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事件,其处理程序显示了一个对话框。现在问题是上面的触发器仅在事件处理程序执行后触发。有没有办法确定Trigger over事件处理程序的优先级,以便应用Template并在之后显示对话框?

1 个答案:

答案 0 :(得分:0)

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

但您可以通过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);