Avalonia:主窗口显示后打开对话框的时机及报错解决
主窗口显示后打开对话框的问题解决方案
主窗口完成加载的时机
在WPF中,主窗口真正完成加载并处于可见状态的关键节点是两个事件:
Loaded:窗口的所有控件已初始化加载,但此时窗口可能还未在屏幕上完全渲染完成ContentRendered:窗口内容已完全渲染并显示在屏幕上,这是窗口确定处于可见状态的时机
打开对话框的代码位置
你遇到的Cannot show window with non-visible owner错误,根源是主窗口还未处于可见状态就被设置为对话框的所有者。最稳妥的做法是把打开对话框的代码放到ContentRendered事件的处理方法里;如果不需要严格等待完全渲染,Loaded事件也可以使用,但ContentRendered能确保窗口已经显示。
代码示例
方法1:绑定ContentRendered事件
在主窗口构造函数中添加事件绑定:
public MainWindow() { InitializeComponent(); ContentRendered += MainWindow_ContentRendered; } private void MainWindow_ContentRendered(object sender, EventArgs e) { var yourDialog = new YourDialogWindow(); yourDialog.Owner = this; yourDialog.ShowDialog(); }
方法2:绑定Loaded事件(适合不需要等待完全渲染的场景)
public MainWindow() { InitializeComponent(); Loaded += MainWindow_Loaded; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { var yourDialog = new YourDialogWindow(); yourDialog.Owner = this; yourDialog.ShowDialog(); }
为什么InitializeComponent()后不行?
InitializeComponent()仅完成XAML解析和控件对象的创建,此时窗口还未加入可视化树,也未完成布局和渲染,处于不可见状态,自然不能作为对话框的所有者。
内容的提问来源于stack exchange,提问作者IronEater
相关产品推荐
相关产品推荐

