DispatcherTimer和显示模态窗口
本文关键字:窗口 模态 显示 DispatcherTimer | 更新日期: 2023-09-27 18:04:41
让我们看看是否有人可以解释我这种行为,也许我该如何解决这个问题。我有一个WPF
应用程序,并在我的ViewModel我有一个DispatcherTimer
。在ViewModel中,我有一个命令来显示模态窗口,如下所示:
private void ShowWindowCommandExecuted()
{
wnNewWindow window = new wnNewWindow();
window.ShowDialog();
}
当我调用这个命令从一个按钮,新的窗口显示和DispatcherTimer
保持在后台运行。到目前为止一切顺利。问题是当我试图从DispatcherTimer
显示窗口时,像这样:
DispatcherTimer timerInstrucciones;
timerInstrucciones = new DispatcherTimer();
timerInstrucciones.Interval = TimeSpan.FromMilliseconds(1000);
timerInstrucciones.Tick += (s, e) =>
{
wnNewWindow window = new wnNewWindow();
window.ShowDialog();
};
timerInstrucciones.Start();
在这种情况下,新窗口也会显示,但只要它是可见的,DispatcherTimer
就会停止"滴答"。我理解DispatcherTimer
在UI线程中运行,但为什么它在这种情况下以不同的方式表现?
一般来说,ShowDialog
是一个模态对话框,它将阻塞调用线程,并显示对话框。它还会阻止与父/所属窗口的交互。
只要你关闭模态对话框,ui线程就会被阻塞。因为它是DispatcherTimer
,所以它属于Window的Dispatcher并在同一个线程中运行。因此,如果这个线程被阻塞,DispatcherTimer
将停止运行。
根据您的评论更新:
我没有通过这方面的任何文档,但基本的区别是DispatcherTimer
将运行Synchronously
,而不是以Asynchronous
的方式。
不会阻塞Dispatcher:
timerInstrucciones.Tick += (s, e) =>
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
wnNewWindow mn = new wnNewWindow();
mn.ShowDialog();
}));
};
将阻塞Dispatcher:
timerInstrucciones.Tick += (s, e) =>
{
this.Dispatcher.Invoke(new Action(() =>
{
wnNewWindow mn = new wnNewWindow();
mn.ShowDialog();
}));
};
由于Dispatcher
每n秒将Invoke
替换Event
,如果线程在调用Event
内的任何操作被阻塞,Event
就不能再被调用了。