WPF中调用Show()显示窗口时控件不显示该如何解决?
问题根因
你遇到的现象本质是WPF UI线程被阻塞:调用waitForm.Show()之后,后续的Thread.Sleep(500)、MainWindow初始化逻辑都运行在UI主线程上,主线程被占满没有空余时间片渲染加载窗口的控件,所以会出现窗口能弹出但内容空白的情况。而ShowDialog()会自主启动消息循环所以能正常渲染控件,但它属于模态窗口,会阻塞后续代码执行,因此无法自动关闭和跳转。
解决方案
采用异步逻辑处理耗时操作,不阻塞UI线程即可在使用Show()的前提下正常渲染所有控件,不需要修改Waiting.xaml、Waiting.xaml.cs、WaitFunc.cs的原有代码,仅修改Login.xaml.cs的登录点击逻辑即可:
private async void btnLogin_Click(object sender, RoutedEventArgs e) { this.Hide(); Waiting waitForm = new Waiting(); waitForm.Show(); // 耗时逻辑全部放到后台线程执行,不占用UI线程的渲染资源 await Task.Run(() => { // 此处替换为你的实际数据库加载、初始化逻辑,Sleep仅为模拟耗时操作 Thread.Sleep(500); }); // await执行完成后自动切回UI线程,可直接操作窗口控件 MainWindow main = new MainWindow(txtUserName.Text); waitForm.Close(); main.Show(); this.Close(); }
如果你要复用已封装的WaitFunc类,也可以使用如下写法:
private async void btnLogin_Click(object sender, RoutedEventArgs e) { this.Hide(); WaitFunc waitFunc = new WaitFunc(); waitFunc.show(); await Task.Run(() => { // 你的实际加载逻辑 Thread.Sleep(500); }); MainWindow main = new MainWindow(txtUserName.Text); waitFunc.Close(); main.Show(); this.Close(); }
注意事项
- 所有数据库查询、网络请求、文件读写这类耗时操作不要放在UI线程执行,统一放到
Task.Run中处理 - 事件处理程序使用
async void是WPF的标准写法,await会自动在耗时逻辑完成后切回UI线程,不需要手动调用Dispatcher处理跨线程操作
内容的提问来源于stack exchange,提问作者Van Le Thanh
相关产品推荐
相关产品推荐

