How to dismiss all WPF menus, popups, etc. by DevExpress programmatically to get around WindowsFormsHost related issue?
Asked Answered
S

3

14

I want it to behave such as you clicked somewhere on application. (which collapses all menus, drop downs, etc)

Actually, I'm trying to get around the interoperability related focus issue you get when you are hosting Windows Forms controls in a WPF application using WindowsFormsHost: If a WPF menu/popup by DevExpress is open and you click on a Windows Forms control, the menu/popup doesn't get dismissed automatically.

Now I have a lot of Windows Forms controls in the WindowsFormsHost and also a lot of DevExpress controls in the WPF area. To get around this easily, I have added a message filter to hook all clicks in application and then I see if the clicked control was a Windows Forms control. Then I need to do something to make all WPF menus, etc. by DevExpress dismissed if they were open.

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;
  }
}
Suprasegmental answered 5/2, 2014 at 11:49 Comment(10)
I tried to set focus to other controls by calling their Focus method but it didn't work.Suprasegmental
Show what have you tried. Explain your problem more clear..Anacreon
Can you show some code that shows the problem? Such as a simplified wpf window showing the issue?Acerbic
I have just realized the problem only lies with the third-party WPF controls that I'm using all over the place. :\ Luckily they have a static method to close all popups. What a waste of +200 rep. :)Suprasegmental
You can't answer your own question and be eligible to the bounty?Suckerfish
Don't think so. But worth a shot? Answer your own question, you may get half back if automatic bounty award allows it. Manual bounty award definitely won't work.Osterhus
I brought this to moderator's attention. Maybe they'll help you.Chickadee
I'd post an answer and see if you can award the bounty to it.Every
@user1004959: meta.stackexchange.com/questions/220725/…Acerbic
You should still write up the solution as an answer, at least if you can do it in such a way that someone else having the same problem with those controls might find it. You can't get the bounty back, but people can still vote up your answer if they find it useful.Palladous
S
3

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

So I had to:

MainWindow.Instance.BarManager.CloseAllPopups();
Suprasegmental answered 9/4, 2014 at 10:0 Comment(0)
P
3

I made a prototype out of your issue and everything works (when I click inside Windows Form Host the outside WPF combox collapse and vice versa).

So we know the native controls works as expected, the problem might be because of the UI framework you are using.

Perth answered 14/2, 2014 at 3:50 Comment(0)
S
3

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

So I had to:

MainWindow.Instance.BarManager.CloseAllPopups();
Suprasegmental answered 9/4, 2014 at 10:0 Comment(0)
C
1

Did you try to loop through the controls and raise the lose focus event?

Constancy answered 14/2, 2014 at 1:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.