Material Design WPF DialogHost 实现异步关闭

发布时间 2023-05-05 23:39:52作者: 蓝蓝的美丽的天空

在撰写一个按钮处理数据同步的事件时,处理前先弹出一个窗口,告知用户正在处理数据,处理数据后再关闭这个弹窗。

 Button按钮的事件代码原先是这样,预想中是处理一些事情后,可以自动关闭弹窗。DialogHost_MySelf就是DialogHost。

1  this.DialogHost_MySelf.IsOpen = true; 
2   /**
3   处理一些事情
4   */
5  this.DialogHost_MySelf.IsOpen = false; 

但在实际运行中发现,并没有按照预想的那样先弹出后关闭,而是直接不弹窗了。

后来在官方文档中发现有这么一句话,这句话的意思是对话框是异步的,您不得不在代码中去处理它。

 也就是说,在之前的代码中,设置IsOpen为true后,并没有立即执行,而是在等待这个按钮事件完成。结果又碰到了设置IsOpen为false的代码,导致最后也不弹窗。

正确代码执行方式如同下图所示,使用Task+Dispatcher.Invoke来实现异步延时关闭弹窗

 

 1 this.DialogHost_MySelf.IsOpen = true;
 2 
 3 Task.Run(async () =>
 4 {
 5     /**
 6      await 处理一些事情
 7      */
 8  Dispatcher.Invoke(() =>
 9    {
10       this.DialogHost_MySelf.IsOpen = false;
11     });
12  });