【发布时间】:2018-01-26 18:11:19
【问题描述】:
我们遇到了一个间歇性问题,在对话窗口的 ShowDialog 方法中抛出了 InvalidOperationException。可疑原因是因为对话框将其Owner 设置为尚未显示的窗口。该结论基于以下几点:
- 主应用程序窗口(用于对话框的
Owner)在其Loaded处理程序期间实例化并调用对话框上的ShowDialog。 - 对话框在其构造过程中将其
Owner设置为应用程序窗口 -
Window.Owner的文档说,如果设置为尚未显示的窗口,它将抛出InvalidOperationException。 - 我们假设(主应用程序窗口)
Loaded事件可能会在窗口显示之前触发。 - 通常不会抛出异常,因为在调用
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;
}
}
【问题讨论】: