何时WPF窗口可用作所有者?

时间:2018-01-26 18:11:20

标签: c# wpf windows

我们遇到一个间歇性问题,即在对话框窗口的InvalidOperationException方法中抛出ShowDialog。可疑原因是因为对话框正在将其Owner设置为尚未显示的窗口。该结论基于以下内容:

  1. 主应用程序窗口(对话框的预期Owner)在ShowDialog处理程序期间在对话框上实例化并调用Loaded
  2. 该对话框在其构造函数
  3. 期间将其Owner设置为应用程序窗口
  4. Window.Owner的文档说如果设置为尚未显示的窗口,它将抛出InvalidOperationException
  5. 我们假设在显示窗口之前可能会触发(主应用程序窗口)Loaded事件。
  6. 通常不会抛出异常,因为主应用程序窗口是在ShowDialog调用时显示的。当主机系统处于压力之下时,应用程序窗口“显示”可能会延迟,因此在调用ShowDialog时,它尚未准备好用作Owner
  7. 问题是:这是真的吗?如果是这样,可以使用什么窗口事件或覆盖来可靠地触发 后显示,以便窗口可以可靠地用作对话框的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;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

  

问题是:这是真的吗?

从检查代码看起来那样。 Chris Sells&amp ;; 编程WPF Ian Griffiths还声明{<1}}事件仅在之前引发窗口。

  

可以使用什么窗口事件或覆盖在显示后可靠地触发,以便窗口可以可靠地用作对话框的所有者,而不管系统条件如何?

在显示窗口时,Loaded事件将被触发一次。我认为这将是你情况的最佳选择。

你也可以随时强制创建一个Window的hWnd,虽然我不确定这是否足以避免异常,因为创建的窗口不一定“显示”。不过,知道你是否最终调用与窗口管理相关的Win32方法是一件有用的事情:

ContentRendered