我有这段代码:
<Menu IsMainMenu="True">
<MenuItem Header="Parent" Click="ParentItem_Click" >
<MenuItem Header="Child" Click="ChildItem_Click">
</MenuItem>
</MenuItem>
</Menu>
当我点击子MenuItem时,父MenuItem也会被提升。我不希望提出父事件。
答案 0 :(得分:4)
这是具有冒泡路由策略的事件的标准行为。您可以在事件处理程序中手动设置eventArgs.Handled = true
。见Marking Routed Events as Handled, and Class Handling
考虑到Click
事件未与PreviewClick
等隧道事件配对 - 您可以尝试使用PreviewMouseDown PreviewMouseUp隧道事件,看看是否可以附加逻辑这些事件。
冒泡:调用事件源上的事件处理程序。路由事件然后路由到连续的父元素,直到到达 元素树根。大多数路由事件使用冒泡路由 战略。冒泡路由事件通常用于报告输入或 来自不同控件或其他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
}
}
希望这有助于某人!