2011-10-10 42 views
2

我正在使用XBAP应用程序,其中用户主要使用键盘进行导航。当我显示一个MessageBox时,我可以按Enter键关闭它,但主应用程序似乎没有重新获得焦点。我必须手动点击屏幕上的鼠标才能将焦点放回应用程序。如何在对话框后设置焦点控件?

有没有办法解决这个问题?

编辑

我可以验证的应用程序仍然具有逻辑焦点,但它只是没有键盘焦点

回答

0

我发现,工作的黑客,虽然我不喜欢它,因为我觉得它把我的Views和我的ViewModel联系起来

我使用IsFocused AttachedProperty将控件绑定到View后面的布尔属性。同一视图也订阅DisplayError事件,该事件显示MessageBox错误,并在之后重置IsFocused属性,以更新UI。最后做出的更改是更新我的ViewModels以将错误发布到EventAggregator,而不是使用MessageBox来处理它们,反正它可能更好。

我想它的工作原理,即使我不喜欢它

-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/

+0

不幸的是,我不认为这会奏效。我的消息框是从ViewModel引发的,而不是我的视图,而我正在使用XBAP而不是桌面应用程序,所以我使用的是'页面'对象,而不是'窗口'对象 – Rachel

+0

根据您从ViewModel中调用它的方式,你的MessageBox应该有一个指向其父窗口的指针(即使这是IE窗口)。你可以检查这个角度。我做了类似的事情,但我使用的框架(Cinch)使我能够在必要时抓取View对象。然后我将它转换为一个Framework元素并调用Focus()。 –

+0

我只是简单地调用'MessageBox.Show(“Some Error Message”);'从我的ViewModel ... – Rachel

0

不知道这是否会帮助你的情况,但在我的情况是好的,我将焦点设置返回主窗口,这是能够与

App.Current.MainWindow.Focus(); 

完成只是要确保正确初始化主窗口,这可能不是,如果一个闪屏或某些登录窗口或东西开始抓起主窗口的作用(通过的StartupUri IE)的情况下,再没有别的此后更新。

这对我很有帮助,因为我在主窗口级别处理所有键盘事件以驱动更新到我的视图模型。

相关问题