4

Word VSTO AddIn (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- context-menu-has-focus-problems

これは 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 に答える