wpf - 如何防止 InvokeCommandAction 将事件传播到父元素?

标签 wpf mvvm command invoke-command event-routing

我意识到当使用与 EventTrigger 关联的 InvokeCommandAcction 时,原始事件仍在路由到父元素,直到它被处理。好吧,我想这是一种预期的行为。但我的问题是如何将事件标记为已处理,以便它不会在整个 UI 树中向上传播?

实际上,当您在命令中处理此事件时,所有内容都将在此命令中处理,因此不需要传播。在我发现的一个极端情况下,它会导致一些不需要的行为。例如,当用户双击一个元素(MouseDoubleClick 事件)时,我会打开一个新窗口。问题是新窗口打开,然后主窗口回到新窗口的前面,因为 MouseDoubleClick 事件刚刚到达 UI 树中的顶部元素。想要的行为是将新窗口保持在前面,但是当 InvokeCommandAction 让事件向上传播时,主窗口收回焦点......

我可以做的是改用 CallMethodAction Assets ,但由于我处于 MVVM 场景中,我不希望在我的代码中使用 UI 事件参数。即使这会让我隐式地将事件标记为已处理并解决问题。

<UserControl x:Class="..."
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    ...
</UserControl>

最佳答案

您可以实现自己的 EventTrigger,将事件标记为已处理。

public class HandlingEventTrigger : System.Windows.Interactivity.EventTrigger
{
    protected override void OnEvent(System.EventArgs eventArgs)
    {
        var routedEventArgs = eventArgs as RoutedEventArgs;
        if (routedEventArgs != null)
            routedEventArgs.Handled = true;

        base.OnEvent(eventArgs);
    }
}

然后替换<i:EventTrigger EventName="MouseDoubleClick"><local:HandlingEventTrigger EventName="MouseDoubleClick">并添加
xmlns:local="clr-namespace:HandlingEventTrigger's namespace here"

到您的用户控件的属性。

关于wpf - 如何防止 InvokeCommandAction 将事件传播到父元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7647625/

相关文章:

wpf - 将 DataGrid 列标题绑定(bind)到 DataContext

c# - 首次加载时 WPF 验证未触发

wpf - 数据绑定(bind)到validation.haserror

php - 使用 phpspec 测试命令处理程序

c# - 文本文字中的 WPF 绑定(bind)

c# - 绑定(bind)运行次数可变的 RichTextBox

Grails 命令对象无法绑定(bind)数字

linux - 存储在终端上执行的命令的输出

c# - 如何在 WPF 中保持 DataGrid 组标题不滚动?

c# - 等待动画在MVVM中完成的最佳方法是什么?