当我想运行长操作时,我想显示模型对话框窗口(等待窗口)
我想在不同的Thread中将此等待窗口显示为ShowDialog()
在进入长时间运行操作之前,我将显示模型对话窗口
完成长时间运行操作后,我将关闭此模型对话窗口
我知道不是在另一个Thread中创建Window,我们可以简单地在另一个Thread中移动长运行代码,但是在我的代码中对此的影响很大。
请为我建议一个解决方案
答案 0 :(得分:10)
我建议你避免像ShowDialog()
这样的WinForms气味解决方案。
看一下开箱即用的WPF ToolKit BusyIndicator它可以利用WPF和XAML的强大功能和灵活性。
BusyIndicator可让用户轻松了解应用程序 繁忙。只需将相关内容包装在一个实例中即可 BusyIndicator控件并在其期间将其IsBusy属性切换为True 任何长时间运行的流程。
它允许构建自定义等待窗口,例如:
您可以完全控制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