簡體   English   中英

WPF窗口什么時候可用作所有者?

[英]When is a WPF window usable as an Owner?

我們有一個間歇性問題,其中在對話框窗口的ShowDialog方法中引發了InvalidOperationException 可疑的原因是因為對話框將其Owner設置為尚未顯示的窗口。 該結論基於以下內容:

  1. 主應用程序窗口(預期為對話框的Owner )在其Loaded處理程序期間實例化並在對話框上調用ShowDialog
  2. 對話框在其構造函數期間將其Owner設置為應用程序窗口
  3. Window.Owner的文檔說,如果將其設置為尚未顯示的窗口,它將拋出InvalidOperationException
  4. 我們假設(主應用程序窗口) Loaded事件可能在顯示窗口之前觸發。
  5. 通常不會引發異常,因為在調用ShowDialog時會顯示主應用程序窗口。 當主機系統承受壓力時,應用程序窗口“ Show”可能會延遲,因此調用ShowDialog時,尚不能用作Owner

問題是:這是真的嗎? 那么,是什么窗口事件或覆蓋,可以用它顯示可靠地觸發,從而使窗口然后可以可靠地用作對話框的Owner ,無論系統的條件?

<Window x:Class="MyApplication.MyMainWindow"
   ... etc...
   Loaded="OnLoaded">
   ... etc...
</Window>

class MyMainWindow : Window
{
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        var dialog = new MyDialog(Application.Current.MainWindow);
        dialog.ShowWindow();
    }
}

class MyDialog: Window
{
    public MyDialog(Window window)
    {
        Owner = window;
    }
}

問題是:這是真的嗎?

從檢查代碼來看就是這樣。 Chris Sells和Ian Griffiths 編寫的WPF編程還指出,恰好顯示窗口之前引發了Loaded事件。

可以在窗口顯示后使用什么窗口事件或替代來可靠地觸發它,以便無論系統狀況如何,都可以將該窗口可靠地用作對話框的所有者?

顯示窗口后,將觸發一次ContentRendered事件。 我認為這將是適合您情況的最佳選擇。

您也可以隨時強制創建Window的hWnd,盡管我不確定這樣做是否足以避免發生異常,因為創建的窗口不一定“顯示”。 盡管如此,知道是否最終調用與窗口管理相關的Win32方法仍然是一件有用的事情:

new WindowInteropHelper(window).EnsureHandle()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM