wpf工作状态
我的应用程序中有一个网格。用户在对话框中选择一些文件后,应用程序将处理一些计算。当应用程序进行计算时,它看起来好像没有响应。如何在计算时显示一些图片并使主窗口为黑白?也许在主窗口“IsBusy”中设置一些dp,并绑定一个带有图片的弹出窗口wpf工作状态,wpf,Wpf,我的应用程序中有一个网格。用户在对话框中选择一些文件后,应用程序将处理一些计算。当应用程序进行计算时,它看起来好像没有响应。如何在计算时显示一些图片并使主窗口为黑白?也许在主窗口“IsBusy”中设置一些dp,并绑定一个带有图片的弹出窗口 您如何在应用程序中实现此逻辑?一种简单的方法是从以下位置使用忙指示灯: 下载二进制文件并将项目引用添加到WPFToolkit.Extended.dll 接下来在“主窗口”中添加以下命名空间: xmlns:ext="clr-namespace:Microsoft
您如何在应用程序中实现此逻辑?一种简单的方法是从以下位置使用忙指示灯: 下载二进制文件并将项目引用添加到WPFToolkit.Extended.dll 接下来在“主窗口”中添加以下命名空间:
xmlns:ext="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
然后在视图中添加busy指示器(将其放置在显示时,它将占据整个屏幕),在这里我的主窗口有两行,我希望控件在这两行上都具有范围。控件的IsBusy属性绑定到视图数据上下文中的bool属性
<ext:BusyIndicator Grid.RowSpan="2" x:Name="busyIndicator" IsBusy="{Binding IsBusy}" />
长时间的计算应该在另一个线程中处理,这样它就不会阻塞用户界面。对于线程,您可以使用。一种简单的方法是从以下位置使用忙指示灯: 下载二进制文件并将项目引用添加到WPFToolkit.Extended.dll 接下来在“主窗口”中添加以下命名空间:
xmlns:ext="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
然后在视图中添加busy指示器(将其放置在显示时,它将占据整个屏幕),在这里我的主窗口有两行,我希望控件在这两行上都具有范围。控件的IsBusy属性绑定到视图数据上下文中的bool属性
<ext:BusyIndicator Grid.RowSpan="2" x:Name="busyIndicator" IsBusy="{Binding IsBusy}" />
长时间的计算应该在另一个线程中处理,这样它就不会阻塞用户界面。对于线程,您可以使用。您应该将长时间运行的任务放在单独的线程中,以避免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);
}
您应该将长时间运行的任务放在一个单独的线程中,以避免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);
}