如何在没有提升父事件的情况下为子菜单项设置click事件?

时间:2012-02-28 11:50:30

标签: c# wpf

我有这段代码:

<Menu IsMainMenu="True">
    <MenuItem Header="Parent" Click="ParentItem_Click" >
        <MenuItem Header="Child" Click="ChildItem_Click">
        </MenuItem>
    </MenuItem>
</Menu>

当我点击子MenuItem时,父MenuItem也会被提升。我不希望提出父事件。

3 个答案:

答案 0 :(得分:4)

这是具有冒泡路由策略的事件的标准行为。您可以在事件处理程序中手动设置eventArgs.Handled = true。见Marking Routed Events as Handled, and Class Handling

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

Routed event strategies

  

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

     

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

     

隧道:最初,调用元素树根的事件处理程序。路由事件然后通过连续的路线   沿着路径的子元素,朝向节点元素   路由事件源(引发路由事件的元素)。   隧道路由事件经常被使用或作为一部分来处理   合成控件,以便复合零件的事件可以   被故意压制或被特定的事件取代   完全控制。 WPF中提供的输入事件经常出现   实现为隧道/冒泡对。隧道活动也是   由于命名,有时称为预览事件   用于配对的约定。

答案 1 :(得分:3)

当点击路由时,您可以使用此代码

private void OnYourMenuItemClicked(object sender, RoutedEventArgs e){
     MenuItem item = e.OriginalSource as MenuItem;
     if(null != item)
     {
         // Handle needed menu item click here
     }

}

答案 2 :(得分:0)

我知道这是4年半,但解决方案非常简单(我只是想通了)。只需为物品命名即可。

XAML

<Menu IsMainMenu="True">
    <MenuItem x:Name="Parent" Header="Parent" Click="ParentItem_Click" >
        <MenuItem x:Name="Child" Header="Child" Click="ChildItem_Click">
        </MenuItem>
    </MenuItem>
</Menu>

CODE

private void ParentItem_Click(object sender, RoutedEventArgs e)
{
     MenuItem item = e.OriginalSource as MenuItem;
     if(item == Parent)
     {
         // Handle Parent
     }
}

private void ChildItem_Click(object sender, RoutedEventArgs e)
{
     MenuItem item = e.OriginalSource as MenuItem;
     if(item == Child)
     {
         // Handle Child
     }
}

希望这有助于某人!