我发现使用与EventTrigger相关联的InvokeCommandAction时,原始事件仍然会一直路由到父元素,直到它被处理。嗯,我想这是预期行为。但我的问题是如何将事件标记为Handled,以便它不会在整个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>