上下文菜单打开事件未在 WPF 中触发
本文关键字:WPF 菜单 事件 上下文 | 更新日期: 2023-09-27 18:34:34
我有一个资源字典,里面有一个上下文菜单:
<ResourceDictionary x:Class="MyApp.Components.MyContextMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyApp"
xmlns:components="clr-namespace:MyApp.Components">
<ContextMenu ContextMenuOpening="OnContextMenuOpening">
资源字典 XAML 后面有以下代码:
using System;
using System.Windows;
using System.Windows.Controls;
namespace MyApp.Components
{
public partial class MyContextMenu : ResourceDictionary
{
public MyContextMenu()
{
InitializeComponent();
}
void OnContextMenuOpening(object sender, ContextMenuEventArgs e)
{
Console.WriteLine("here i am!");
}
}
}
日志未显示。我想知道为什么事件没有触发或到达正确的位置 - 问题是因为我已将上下文菜单包装在这个资源字典中?
更新:有趣的是,如果我删除代码隐藏函数,在编译过程中会出现错误:
不包含"ContextMenu_OnContextMenuOpening"的定义 并且没有扩展方法"ContextMenu_OnContextMenuOpening"接受 可以找到类型为"MyApp.Components.MyContextMenu"的第一个参数 (是否缺少 using 指令或程序集引用?
更新2:看起来Console.WriteLine
和Debug.WriteLine
都会产生输出,但只是"随机",尤其是当我单击项目底部附近时。也许某种碰撞检测不起作用?
ContextMenuOpen 事件必须在 ContextMenu 的祖先而不是 ContextMenu 本身上处理。如果您尝试在上下文菜单上处理它,则只有在上下文菜单已打开后右键单击时,才会触发该事件。
kurrazyman有正确的答案,但我花了一段时间才理解它。就我而言,我有一个带有上下文菜单的 TreeView 控件。使用myTreeView.ContextMenu.ContextMenuOpening
不起作用,但使用myTreeView.ContextMenuOpening
起作用。
这是框架中的一个错误:http://connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-open-event-not-en-en-trigger-correct-
上下文菜单的打开事件不会在第一次右键单击时触发。 仅当您在不移动的情况下进行两次连续右键单击时,它才会触发 鼠标。
它不是错误,它正在工作...这是大多数人在ContextMenuOpen事件中最常见的错误...考虑这两种不同的方案,以找出此问题的实际原因,
场景 1(这不起作用(:
<ListBox Name="lb_sizes" Height="120">
<ListBox.ContextMenu>
<ContextMenu ContextMenuOpening="My_ContextMenuOpening">
<MenuItem Header="Delete"/>
<MenuItem Header="Delete All"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
方案 2(这将起作用(:
<ListBox Name="lb_sizes" Height="120" ContextMenuOpening="My_ContextMenuOpening">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete"/>
<MenuItem Header="Delete All"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
唯一的区别是将上下文菜单打开事件分配给正确的元素...在场景 1 中,它被分配(附加(到<ContextMenu>
元素,在场景 2 中,它被分配给<ListBox>
元素,这是正确的方法,应该可以工作。
我正在使用IsVisibleChanged事件:
private void ContextMenu_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var isVisible = (bool)e.NewValue;
if (isVisible)
{
//...
}
}