如何在对话框后设置聚焦控件?

时间:2011-10-10 16:31:47

标签: wpf dialog focus xbap

我正在开发一个XBAP应用程序,用户主要使用键盘进行导航。当我显示MessageBox时,我可以按Enter键关闭它,但主应用程序似乎没有重新获得焦点。我必须在屏幕上手动单击鼠标才能将焦点重新放回应用程序。

有解决方法吗?

修改

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

3 个答案:

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