C# 如何通过DevExpress以编程方式关闭所有WPF菜单、弹出窗口等,以绕过WindowsFormsHost相关问题?
我希望它表现得像你在应用程序上点击的某个地方。(折叠所有菜单、下拉列表等) 事实上,我正试图回避使用C# 如何通过DevExpress以编程方式关闭所有WPF菜单、弹出窗口等,以绕过WindowsFormsHost相关问题?,c#,.net,wpf,devexpress,windowsformshost,C#,.net,Wpf,Devexpress,Windowsformshost,我希望它表现得像你在应用程序上点击的某个地方。(折叠所有菜单、下拉列表等) 事实上,我正试图回避使用WindowsFormsHost在WPF应用程序中托管Windows窗体控件时遇到的与互操作性相关的焦点问题:如果DevExpress的WPF菜单/弹出窗口打开,并且您单击Windows窗体控件,则菜单/弹出窗口不会自动关闭 现在我在WindowsFormsHost中有很多Windows窗体控件,在WPF区域也有很多DevExpress控件。为了轻松解决这个问题,我添加了一个消息过滤器来钩住应用程
WindowsFormsHost
在WPF应用程序中托管Windows窗体控件时遇到的与互操作性相关的焦点问题:如果DevExpress的WPF菜单/弹出窗口打开,并且您单击Windows窗体控件,则菜单/弹出窗口不会自动关闭
现在我在WindowsFormsHost
中有很多Windows窗体控件,在WPF区域也有很多DevExpress控件。为了轻松解决这个问题,我添加了一个消息过滤器来钩住应用程序中的所有单击,然后我查看单击的控件是否是Windows窗体控件。然后,我需要做一些事情,使所有的WPF菜单等由DevExpress解散,如果他们是开放的
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;
}
}
您是否尝试循环浏览控件并引发失焦事件?我根据您的问题制作了一个原型,一切正常(当我单击Windows窗体内的主机时,外部WPF combox崩溃,反之亦然) 因此,我们知道本机控件按预期工作,问题可能是因为您使用的UI框架。 所以我不得不:
MainWindow.Instance.BarManager.CloseAllPopups();
我试图通过调用其他控件的focus方法将焦点设置为其他控件,但没有成功。请展示您所做的尝试。更清楚地解释你的问题。你能展示一些代码来说明问题吗?例如一个简化的wpf窗口显示问题?我刚刚意识到问题只存在于我到处使用的第三方wpf控件上:幸运的是,他们有一个静态方法来关闭所有弹出窗口。多么浪费+200个代表:)你仍然应该写下解决方案作为答案,至少如果你可以这样做,让那些控件有相同问题的其他人可能会发现它。你不能拿回赏金,但是如果人们觉得你的答案有用的话,他们仍然可以投票支持你。谢谢老兄!你帮我节省了很多时间!