WPF调用MessageBox.Show异步

时间:2009-07-27 02:28:15

标签: wpf asynchronous messagebox

我有一个具有计时器的对象,当计时器达到5分钟时它会抛出一个事件。在这个例子中,我在MainWindow.xaml.cs中调用了MessageBox.Show(“Something”)。

问题是当我调用MessageBox.Show()时,计时器停止,直到用户点击确定。即使用户没有点击确定,我也需要计时器继续运行。这是一个好的,优雅的方式吗?这是我到目前为止尝试过的(但没有奏效):

        private void OnAlert(object sender, MvpEventArgs e)
        {
            this.Dispatcher.Invoke(
                System.Windows.Threading.DispatcherPriority.Normal,
                new Action(
                  delegate()
                  {
                      MessageBox.Show("Alert");
                  }
              ));
        }

3 个答案:

答案 0 :(得分:2)

您可以使用BeginInvoke异步调用消息框。我最近这样做了,并在这里写了博客:http://www.dmcinfo.com/blog.aspx/articleType/ArticleView/articleId/163/Asynchronous-Message-Box-in-WPF.aspx。希望这会有所帮助。

答案 1 :(得分:1)

你使用什么样的计时器?试试DispatchTimer。没有多大意义,它会停止。您可能必须明确事物(从已完成的处理程序再次调用.Start(),但DispatchTimer会自动重置。)

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx

你使用DispatchTimer得到的另一件事是它的Dispatch队列会自动评估它的Tick事件,所以你不必将它显式地放在Dispatch队列中......只需自己调用MessageBox.Show。 :)

另外......你在做什么听起来很糟糕...我希望MessageBox.Show只是你的概念证明,你将用SomethingBetterAndNotSoAnnoyingAndModal.Show()替换它,但这对你没有帮助问题,只是观察。

答案 2 :(得分:0)

我不会称之为优雅,但您可以构建自己的Window作为Messagebox使用“Show”而不是“ShowDialog”来调用它。