上下文菜单打开事件未在 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.WriteLineDebug.WriteLine都会产生输出,但只是"随机",尤其是当我单击项目底部附近时。也许某种碰撞检测不起作用?

上下文菜单打开事件未在 WPF 中触发

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)
    {
        //...
    }
}