2011-10-10 66 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)的情況下,再沒有別的此後更新。

這對我很有幫助,因爲我在主窗口級別處理所有鍵盤事件以驅動更新到我的視圖模型。