我在我的应用程序中有一个网格。用户在对话框应用程序中选择一些文件进行一些计算后。当应用程序正在进行计算时,它看起来没有响应。如何显示一些图片,并使黑色&白色的主窗口计算?也许在MainWindow中做一些dp“IsBusy”,然后用图片绑定弹出窗口?wpf工作状态
如何在您的应用程序中实现此逻辑?
我在我的应用程序中有一个网格。用户在对话框应用程序中选择一些文件进行一些计算后。当应用程序正在进行计算时,它看起来没有响应。如何显示一些图片,并使黑色&白色的主窗口计算?也许在MainWindow中做一些dp“IsBusy”,然后用图片绑定弹出窗口?wpf工作状态
如何在您的应用程序中实现此逻辑?
一个简单的方法是使用从Extended WPF Toolkit繁忙的指标:
下载中心的二进制文件,并添加项目引用WPFToolkit.Extended.dll。
下一页加入跟随在你的“主窗口”命名空间:
xmlns:ext="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
然后在视图中添加繁忙的指标(放置,使显示的时候,它会占据整个屏幕),在这里我的主窗口两行,我希望控件跨越两行。该控件的IsBusy属性绑定到视图的数据上下文中的bool属性。
<ext:BusyIndicator Grid.RowSpan="2" x:Name="busyIndicator" IsBusy="{Binding IsBusy}" />
应该在另一个线程中处理持久计算,以便它不会阻塞用户界面。对于线程,您可以使用BackgroundWorker class。
您应该在单独的线程中执行长时间运行的任务以避免UI阻塞。 这里有一种方法,你可以做到这一点:
定义如下后台线程:
//Delegate that you could pass into the worker thread
public delegate void ProgressMonitor(string s);
//Call this to start background work
void StartLongRunningWork(ProgressMonitor mon)
{
using (BackgroundWorker bgw = new BackgroundWorker())
{
bgw.DoWork += WorkerThread;
bgw.RunWorkerCompleted += WorkerThreadCompleted;
bgw.RunWorkerAsync(mon);
}
}
void WorkerThread(object sender, DoWorkEventArgs e)
{
ProgressMonitor pm = (ProgressMonitor)e.Argument;
WorkerActual(pm, <any other parameters>);
}
void WorkerActual(ProgressMonitor pm,<any other parameters>)
{
...
pm("Doing x");
Do long running task
pm("Doing y");
...
}
//This function is called in case of Exception, Cancellation or successful completion
//of the background worker. Handle each event appropriately
void WorkerThreadCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
//Long running task threw an exception
}
else
if (e.Cancelled)
{
//Long running task was cancelled
}
else
{
//Long running task was successfuly completed
}
}
而且如下调用它:
private void UpDateProgressLabel(string s)
{
this.Dispatcher.BeginInvoke((Action)delegate
{
NotificationLabel.Content = s;
});
}
private void Button_Click(object sender, RoutedEventArgs e)
{
StartLongRunningWork(UpDateProgressLabel);
}