我正在编写一个托管在 Word VSTO 插件(WinForms)中的 WPF 控件。现在我遇到了上下文菜单上的鼠标单击事件的问题。
如果我单击左半部分的上下文菜单项(WinForms 应用程序上方的部分),则单击将直接转到 WinForms 应用程序,并且我的上下文菜单不会收到事件。
如果我单击项目的右半部分(WPF 表单上方的部分),一切都会按预期工作。
有人可以帮我解决这个问题吗?
我正在编写一个托管在 Word VSTO 插件(WinForms)中的 WPF 控件。现在我遇到了上下文菜单上的鼠标单击事件的问题。
如果我单击左半部分的上下文菜单项(WinForms 应用程序上方的部分),则单击将直接转到 WinForms 应用程序,并且我的上下文菜单不会收到事件。
如果我单击项目的右半部分(WPF 表单上方的部分),一切都会按预期工作。
有人可以帮我解决这个问题吗?
经过一些深入的研究,我偶然发现了以下错误:
它适用于 Excel 2007,但仍适用于其他 Office 产品(2007、2010)。我设法使用此处描述的方法解决了我的问题:
来自非活动博客的答案是:
声明一个类级别的调度程序框架对象
System.Windows.Threading.DispatcherFrame _frame;
订阅菜单的 GotFocusEvent 和 LostFocusEvent:
_menu.AddHandler(System.Windows.UIElement.GotFocusEvent,new RoutedEventHandler(OnGotFocusEvent));
_menu.AddHandler(System.Windows.UIElement.LostFocusEvent, new RoutedEventHandler(OnLostFocusEvent));
下面是 GotFocusEvent 和 LostFocusEvent 的事件过程的实现:
private void OnGotFocusEvent(object sender, RoutedEventArgs e)
{
if (LogicalTreeHelper.GetParent((DependencyObject)e.OriginalSource) == _menu)
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal (DispatcherOperationCallback)delegate(object unused)
{
_frame = new DispatcherFrame();
Dispatcher.PushFrame(_frame);
return null;
}, null);
}
}
private void OnLostFocusEvent(object sender, RoutedEventArgs e)
{
if (LogicalTreeHelper.GetParent((DependencyObject)e.OriginalSource) == _menu)
{
_frame.Continue = false;
}
}
就我而言,不需要 if 语句,我订阅了这样的事件
<EventSetter Event="GotFocus" Handler="contextMenu_GotFocus" />
<EventSetter Event="LostFocus" Handler="contextMenu_LostFocus" />