2011-09-10 135 views
4

当我要运行长时间操作我想显示模式对话框窗口(等待窗口)WPF等待窗口

我想显示此等待窗口在不同的线程中的ShowDialog()

进入没过多久运行的操作,我将显示模式对话窗口

与长期运行的操作完成后,我将关闭此模式对话窗口

我知道的,而不是在另一个线程创建窗口,我们可以简单地移动长在肛门运行代码线程但在我的代码中的影响是沉重的。

请建议我该

+0

你们是不是要防止用户长时间运行的操作过程中访问你的应用程序UI的休息吗? –

回答

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(); 

您创建一个新的调度程序将处理在新线程的UI消息和事件。附加的Closed事件处理程序确保创建的分派器在关闭表单后不会继续运行,从而使应用程序永远不会运行。

8

我建议你避免使用WinForms-smell解决方案,如ShowDialog()调用。 看一下开箱即用的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例子和下载。

0

感谢您提供解决方案。

其实我使用.net 3.5框架多数民众赞成的原因不能使用繁忙的指标。

我所做的是:根据第一个解决方案,我为长时间运行的进程创建了后台工作器,并在等待窗口中使用了ShowDialog()。

感谢你们为我提供可能的方式来实现我的目标

Milind

+1

扩展WPF工具包中的BusyIndi​​cator也可用于.NET 3.5。 –

+0

@Milind:Brian Lagunas对,你也可以在3.5中使用BusyIndi​​cator – sll