我意识到,当使用与 EventTrigger 关联的 InvokeCommandAcction 时,原始事件仍在路由到父元素,直到它被处理。好吧,我想这是一种预期的行为。但我的问题是如何将事件标记为已处理,以便它不会在整个 UI 树中传播?
实际上,当您在命令中处理此事件时,所有内容都将在此命令中处理,因此不需要传播。在我发现的一个极端情况下,它会导致一些不需要的行为。例如,当用户双击一个元素(MouseDoubleClick 事件)时,我会打开一个新窗口。问题是新窗口打开,然后主窗口回到新窗口的前面,因为 MouseDoubleClick 事件刚刚到达 UI 树中的顶部元素。想要的行为是将新窗口保持在前面,但随着 InvokeCommandAction 让事件向上传播,主窗口收回焦点......
我可以做的是改用 CallMethodAction 资产,但由于我处于 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>