WPF等待窗口

时间:2011-09-10 05:32:45

标签: c# wpf multithreading

当我想运行长操作时,我想显示模型对话框窗口(等待窗口)

我想在不同的Thread中将此等待窗口显示为ShowDialog()

在进入长时间运行操作之前,我将显示模型对话窗口

完成长时间运行操作后,我将关闭此模型对话窗口

我知道不是在另一个Thread中创建Window,我们可以简单地在另一个Thread中移动长运行代码,但是在我的代码中对此的影响很大。

请为我建议一个解决方案

3 个答案:

答案 0 :(得分:10)

我建议你避免像ShowDialog()这样的WinForms气味解决方案。 看一下开箱即用的WPF ToolKit BusyIndicator它可以利用WPF和XAML的强大功能和灵活性。

  

BusyIndi​​cator可让用户轻松了解应用程序   繁忙。只需将相关内容包装在一个实例中即可   BusyIndi​​cator控件并在其期间将其IsBusy属性切换为True   任何长时间运行的流程

它允许构建自定义等待窗口,例如:

enter image description here

您可以完全控制UI布局,并可以定义自己的DataTemplate:

<extToolkit:BusyIndicator IsBusy="True" DisplayAfter="0">
       <extToolkit:BusyIndicator.BusyContentTemplate>
            <DataTemplate>
               ....

有关更多示例和下载,请参阅Extended WPF Toolkit BusyIndicator

答案 1 :(得分:6)

首先,我的建议是从UI线程中删除“长时间运行的操作”。

话虽这么说,这是一篇讨论你试图做什么的文章。

http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/

提供以下代码:

Thread thread = new Thread(() =>
    {
      Window1 w = new Window1();
      w.Show();

      w.Closed += (sender2, e2) =>
      w.Dispatcher.InvokeShutdown();

      System.Windows.Threading.Dispatcher.Run();
    });

thread.SetApartmentState(ApartmentState.STA);
thread.Start();

您创建一个新的Dispatcher,它将处理新线程上的UI消息和事件。附加的Closed事件处理程序可确保在关闭表单后创建的调度程序不会继续运行,从而使应用程序无法“永久”运行。

答案 2 :(得分:0)

感谢您提供解决方案。

其实我使用的是.Net 3.5框架,原因是它无法使用Busy指标。

我所做的是:根据第一个解决方案,我为长时间运行的过程创建了Background worker,并在Wait窗口中使用了ShowDialog()。

感谢大家为我提供实现目标的可能途径

Milind