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

时间:2014-02-05 11:49:42

标签: c# .net wpf devexpress windowsformshost

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

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

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

GlobalMouseHandler globalClick = new GlobalMouseHandler();
System.Windows.Forms.Application.AddMessageFilter( globalClick );

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;
  }
}

3 个答案:

答案 0 :(得分:3)

我根据您的问题制作了原型并且一切正常(当我在Windows窗体中单击时,外部WPF combox崩溃,反之亦然)。

因此我们知道本机控件按预期工作,问题可能是因为您正在使用的UI框架。

答案 1 :(得分:3)

https://documentation.devexpress.com/#wpf/DevExpressXpfBarsBarManager_CloseAllPopupstopic

所以我不得不:

MainWindow.Instance.BarManager.CloseAllPopups();

答案 2 :(得分:1)

您是否尝试循环控制并引发失去焦点事件?