如何在不引发父事件的情况下为子菜单项设置点击事件?

ali*_*zri 2 c# wpf

我有这个代码:

<Menu IsMainMenu="True">
    <MenuItem Header="Parent" Click="ParentItem_Click" >
        <MenuItem Header="Child" Click="ChildItem_Click">
        </MenuItem>
    </MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)

当我单击子MenuItem时,父MenuItem也将被提升。我不希望那个父母事件发生。

sll*_*sll 5

这是带有冒泡路由策略的事件的标准行为。您可以eventArgs.Handled = true在事件处理程序中手动设置。请参阅将路由事件标记为已处理和类处理

考虑到该Click事件未与类似的隧道事件配对PreviewClick-您可以尝试使用PreviewMouseDown PreviewMouseUp隧道事件,并查看是否可以将逻辑附加到这些事件。

路由事件策略:

冒泡:调用事件源上的事件处理程序。然后,路由事件路由到连续的父元素,直到到达元素树的根。大多数路由事件都使用冒泡路由策略。冒泡路由事件通常用于报告来自不同控件或其他UI元素的输入或状态更改。

直接:只有源元素本身才有机会调用处理程序作为响应。这类似于Windows窗体用于事件的“路由”。但是,与标准CLR事件不同,直接路由事件支持类处理(将在后面的部分中说明类处理),并且可由EventSetter和EventTrigger使用。

隧道传输:最初,将调用元素树根目录处的事件处理程序。然后,路由事件沿着路径沿连续的子元素行进,到达作为路由事件源的节点元素(引发路由事件的元素)。隧道路由事件通常作为控件复合的一部分来使用或处理,从而可以有意抑制来自复合零件的事件,或者将其替换为特定于整个控件的事件。WPF中提供的输入事件通常实现为隧道/冒泡对。隧道事件有时也称为“预览”事件,因为该对使用了命名约定。