我意识到当使用与 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/