【问题标题】:When is a WPF window usable as an Owner?WPF 窗口何时可用作所有者?
【发布时间】:2018-01-26 18:11:19
【问题描述】:

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

  1. 主应用程序窗口(用于对话框的Owner)在其Loaded 处理程序期间实例化并调用对话框上的ShowDialog
  2. 对话框在其构造过程中将其Owner 设置为应用程序窗口
  3. Window.Owner 的文档说,如果设置为尚未显示的窗口,它将抛出 InvalidOperationException
  4. 我们假设(主应用程序窗口)Loaded 事件可能会在窗口显示之前触发。
  5. 通常不会抛出异常,因为在调用ShowDialog 时会显示主应用程序窗口。当主机系统处于压力之下时,应用程序窗口“显示”可能会延迟,因此在调用ShowDialog 时,它还没有准备好用作Owner

问题是:这是真的吗?如果是这样,可以使用什么窗口事件或覆盖来可靠地触发它在显示之后,以便该窗口可以可靠地用作对话框的Owner,而不管系统条件如何? p>

<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;
    }
}

【问题讨论】:

    标签: c# wpf windows


    【解决方案1】:

    问题是:这是真的吗?

    从检查代码来看是这样的。 Chris Sells 和 Ian Griffiths 的 Programming WPF 还指出,Loaded 事件仅在显示窗口之前引发。

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

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

    您也可以随时强制创建窗口的 hWnd,但我不确定这是否足以避免异常,因为创建的窗口不一定“显示”。尽管如此,了解您是否最终调用了与窗口管理相关的 Win32 方法仍然是一件有用的事情:

    new WindowInteropHelper(window).EnsureHandle()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2010-11-06
      • 2023-03-09
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多