我正在使用XBAP应用程序,其中用户主要使用键盘进行导航。当我显示一个MessageBox
时,我可以按Enter键关闭它,但主应用程序似乎没有重新获得焦点。我必须手动点击屏幕上的鼠标才能将焦点放回应用程序。如何在对话框后设置焦点控件?
有没有办法解决这个问题?
编辑
我可以验证的应用程序仍然具有逻辑焦点,但它只是没有键盘焦点
我正在使用XBAP应用程序,其中用户主要使用键盘进行导航。当我显示一个MessageBox
时,我可以按Enter键关闭它,但主应用程序似乎没有重新获得焦点。我必须手动点击屏幕上的鼠标才能将焦点放回应用程序。如何在对话框后设置焦点控件?
有没有办法解决这个问题?
编辑
我可以验证的应用程序仍然具有逻辑焦点,但它只是没有键盘焦点
我发现,工作的黑客,虽然我不喜欢它,因为我觉得它把我的Views和我的ViewModel联系起来
我使用IsFocused AttachedProperty将控件绑定到View后面的布尔属性。同一视图也订阅DisplayError
事件,该事件显示MessageBox
错误,并在之后重置IsFocused
属性,以更新UI。最后做出的更改是更新我的ViewModels以将错误发布到EventAggregator
,而不是使用MessageBox
来处理它们,反正它可能更好。
我想它的工作原理,即使我不喜欢它
using System.Runtime.InteropServices;
using System.Windows.Interop;
public class Interop
{
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
public static IntPtr GetWindowHandle(Window window)
{
return new WindowInteropHelper(window).Handle;
}
}
// In main window, when the MessageBox is closed
IntPtr window = Interop.GetWindowHandle(this);
IntPtr focused = Interop.GetForegroundWindow();
if (window != focused)
{
Interop.SetForegroundWindow(window);
}
http://tech.avivo.si/2009/11/how-to-focus-window-in-wpf-when-it-gets-out-of-focus/
不知道这是否会帮助你的情况,但在我的情况是好的,我将焦点设置返回主窗口,这是能够与
App.Current.MainWindow.Focus();
完成只是要确保正确初始化主窗口,这可能不是,如果一个闪屏或某些登录窗口或东西开始抓起主窗口的作用(通过的StartupUri IE)的情况下,再没有别的此后更新。
这对我很有帮助,因为我在主窗口级别处理所有键盘事件以驱动更新到我的视图模型。
不幸的是,我不认为这会奏效。我的消息框是从ViewModel引发的,而不是我的视图,而我正在使用XBAP而不是桌面应用程序,所以我使用的是'页面'对象,而不是'窗口'对象 – Rachel
根据您从ViewModel中调用它的方式,你的MessageBox应该有一个指向其父窗口的指针(即使这是IE窗口)。你可以检查这个角度。我做了类似的事情,但我使用的框架(Cinch)使我能够在必要时抓取View对象。然后我将它转换为一个Framework元素并调用Focus()。 –
我只是简单地调用'MessageBox.Show(“Some Error Message”);'从我的ViewModel ... – Rachel