如何通过编程方式解除DevExpress的所有WPF菜单,弹出窗口等,以解决与WindowsFormsHost相关的问题?

use*_*959 14 .net c# wpf devexpress windowsformshost

我希望它的行为就像你在应用程序上的某个地方点击一样.(折叠所有菜单,下拉等)

实际上,我正在尝试解决您在WPF应用程序中托管Windows窗体控件时遇到的与互操作性相关的焦点问题WindowsFormsHost:如果DevExpress的WPF菜单/弹出窗口打开并且您单击Windows窗体控件,则菜单/ popup不会自动被解雇.

现在我WindowsFormsHost在WPF区域中有很多Windows Forms控件以及很多DevExpress控件.为了轻松解决这个问题,我添加了一个消息过滤器来挂钩应用程序中的所有点击,然后我看看点击的控件是否是Windows窗体控件.然后我需要做一些事情来使DevExpress的所有WPF菜单等被解雇,如果它们是开放的.

GlobalMouseHandler globalClick = new GlobalMouseHandler();
System.Windows.Forms.Application.AddMessageFilter( globalClick );
Run Code Online (Sandbox Code Playgroud)

GlobalMouseHandler:

public class GlobalMouseHandler : System.Windows.Forms.IMessageFilter
{
  private const int WM_LBUTTONDOWN = 0x201;
  private const int WM_RBUTTONDOWN = 0x204;

  public bool PreFilterMessage( ref System.Windows.Forms.Message m )
  {
    if( m.Msg == WM_LBUTTONDOWN || m.Msg == WM_RBUTTONDOWN )
    {
      var c = System.Windows.Forms.Control.FromHandle( m.HWnd );

      if( c != null )
        // TODO: CLOSE ALL WPF MENUS ETC
        // Didn't work: MainWindow.Instance.ARandomControl.Focus();
    }

    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)