[英]WPF ContextMenuOpening event not firing when TextBox has .Text
[英]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.WriteLine
和Debug.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.