我正在使用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