繁体   English   中英

ContextMenuOpening事件没有在WPF中触发?

[英]ContextMenuOpening event not firing in WPF?

我有一个资源字典,里面有一个上下文菜单:

<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产生输出,但只是“随机”,尤其是当我点击项目底部附近时。 某种碰撞检测可能不起作用?

ContextMenuOpening事件必须在ContextMenu的祖先上处理,而不是在ContextMenu本身上处理。 如果您尝试在ContextMenu上处理它,则只有在ContextMenu已经打开时右键单击才会触发事件。

这是框架中的一个错误: http//connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-opening-event-doesnt-fire-properly

第一次右键单击时不会触发上下文菜单的开启事件。 只有在不移动鼠标的情况下进行两次连续右键单击时才会触发。

我相信kurrazyman有正确的答案,但我花了一段时间来理解它。 在我的例子中,我有一个带有上下文菜单的TreeView控件。 使用myTreeView.ContextMenu.ContextMenuOpening不起作用,但使用myTreeView.ContextMenuOpening

我正在使用IsVisibleChanged事件:

private void ContextMenu_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var isVisible = (bool)e.NewValue;
    if (isVisible)
    {
        //...
    }
}

它不是一个bug,它正在工作......这是大多数人用ContextMenuOpening事件做的最常见的错误......考虑这两个不同的场景来找出这个问题的实际原因,

情景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>

唯一的区别是将ContextMenuOpening事件分配给正确的元素...在场景1中它被分配(附加)到<ContextMenu>元素,而在场景2中,它被分配给<ListBox>元素,这是正确的方法,并且应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM