我正在开发一个XBAP应用程序,用户主要使用键盘进行导航。当我显示MessageBox
时,我可以按Enter键关闭它,但主应用程序似乎没有重新获得焦点。我必须在屏幕上手动单击鼠标才能将焦点重新放回应用程序。
有解决方法吗?
修改
我可以验证该应用仍然具有逻辑焦点,但它只是没有键盘焦点
答案 0 :(得分:0)
我找到了一个有效的黑客,虽然我不喜欢它,因为我觉得它将我的观点与我的ViewModel联系在一起
我正在使用IsFocused AttachedProperty将控件绑定到View后面的布尔属性。同一个View还订阅了显示DisplayError
错误的MessageBox
事件,然后重置IsFocused
属性,以便更新UI。最后一次更改是更新我的ViewModel以将错误发布到EventAggregator
,而不是使用MessageBox
处理自己,这可能会更好。
我认为它有效,即使我不喜欢它
答案 1 :(得分:0)
不确定这是否会对您的情况有所帮助,但在我的情况下我可以将焦点设置回主窗口,这可以通过
完成App.Current.MainWindow.Focus();
确保主窗口已正确初始化,如果启动画面或某些登录窗口或某些东西最初抓住主窗口角色(即通过StartupUri),则可能不是这种情况,之后没有其他任何更新。
这对我有用,因为我在主窗口级处理所有键盘事件以驱动我的视图模型的更新。
答案 2 :(得分:-1)
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/