WPF中的Windows的ShowDialog方法並沒有提供設定Owner的參數,開發人員需要在ShowDialog前設定好Window的Owner屬性,正因為如此,許多時候你可能就忘了設定Owner,直接把對話方塊顯示出去了。這樣顯示的對話方塊看似沒有問題,但是當使用者在工作列切換表單或者切換至程式時,對話方塊會顯示在主表單後面,而此時主表單是不可點的!如果主表單可以覆蓋整個對話方塊(通常是這樣的),那麼此時使用者將會無法操作整個程式,這個問題在另一篇文章裡仔細討論過(WPF:更好得理解對話方塊和ShowDialog方法)。
寫了個輔助類型會自動化佈建Owner然後再調用ShowDialog方法,當然自動化佈建的Owner就是Windows的當前表單,通過GetForegroundWindow API擷取當前表單的控制代碼,然後將其轉換成WPF的Window對象。
代碼:
//+ using System.Runtime.InteropServices;
//+ using System.Windows.Interop;
class DialogHelper
{
//從Handle中擷取Window對象
static Window GetWindowFromHwnd(IntPtr hwnd)
{
return (Window)HwndSource.FromHwnd(hwnd).RootVisual;
}
//GetForegroundWindow API
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
//調用GetForegroundWindow然後調用GetWindowFromHwnd
static Window GetTopWindow()
{
var hwnd = GetForegroundWindow();
if (hwnd == null)
return null;
return GetWindowFromHwnd(hwnd);
}
//顯示對話方塊並自動化佈建Owner
public static void ShowDialog(Window win)
{
win.Owner = GetTopWindow();
win.ShowDialog();
}
}
最後直接調用ShowDialog靜態方法就可以了!
DialogHelper.ShowDialog(new MainWindow());