4

我正在编写一个托管在 Word VSTO 插件(WinForms)中的 WPF 控件。现在我遇到了上下文菜单上的鼠标单击事件的问题。

如果我单击左半部分的上下文菜单项(WinForms 应用程序上方的部分),则单击将直接转到 WinForms 应用程序,并且我的上下文菜单不会收到事件。

如果我单击项目的右半部分(WPF 表单上方的部分),一切都会按预期工作。

说明问题

有人可以帮我解决这个问题吗?

4

2 回答 2

1

经过一些深入的研究,我偶然发现了以下错误:

https://web.archive.org/web/20101211205036/http://connect.microsoft.com:80/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-task-pane-with-wpf-上下文菜单有焦点问题

它适用于 Excel 2007,但仍适用于其他 Office 产品(2007、2010)。我设法使用此处描述的方法解决了我的问题:

https://web.archive.org/web/20151231010333/http://blogs.msdn.com/b/vsod/archive/2009/12/16/excel-2007-wpf-events-are-not-fired- for-items-that-overlap-excel-ui-for-wpf-context-menus.aspx

于 2012-07-26T12:19:06.880 回答
1

来自非活动博客的答案是:

声明一个类级别的调度程序框架对象

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" />
于 2020-02-27T15:37:17.783 回答