我们遇到一个间歇性问题,即在对话框窗口的InvalidOperationException
方法中抛出ShowDialog
。可疑原因是因为对话框正在将其Owner
设置为尚未显示的窗口。该结论基于以下内容:
Owner
)在ShowDialog
处理程序期间在对话框上实例化并调用Loaded
。Owner
设置为应用程序窗口
Window.Owner
的文档说如果设置为尚未显示的窗口,它将抛出InvalidOperationException
。 Loaded
事件。ShowDialog
调用时显示的。当主机系统处于压力之下时,应用程序窗口“显示”可能会延迟,因此在调用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;
}
}
答案 0 :(得分:0)
问题是:这是真的吗?
从检查代码看起来那样。 Chris Sells&amp ;; 编程WPF Ian Griffiths还声明{<1}}事件仅在之前引发窗口。
可以使用什么窗口事件或覆盖在显示后可靠地触发,以便窗口可以可靠地用作对话框的所有者,而不管系统条件如何?
在显示窗口时,Loaded
事件将被触发一次。我认为这将是你情况的最佳选择。
你也可以随时强制创建一个Window的hWnd,虽然我不确定这是否足以避免异常,因为创建的窗口不一定“显示”。不过,知道你是否最终调用与窗口管理相关的Win32方法是一件有用的事情:
ContentRendered