wpf工作状态

wpf工作状态,wpf,Wpf,我的应用程序中有一个网格。用户在对话框中选择一些文件后,应用程序将处理一些计算。当应用程序进行计算时,它看起来好像没有响应。如何在计算时显示一些图片并使主窗口为黑白?也许在主窗口“IsBusy”中设置一些dp,并绑定一个带有图片的弹出窗口 您如何在应用程序中实现此逻辑?一种简单的方法是从以下位置使用忙指示灯: 下载二进制文件并将项目引用添加到WPFToolkit.Extended.dll 接下来在“主窗口”中添加以下命名空间: xmlns:ext="clr-namespace:Microsoft

我的应用程序中有一个网格。用户在对话框中选择一些文件后,应用程序将处理一些计算。当应用程序进行计算时,它看起来好像没有响应。如何在计算时显示一些图片并使主窗口为黑白?也许在主窗口“IsBusy”中设置一些dp,并绑定一个带有图片的弹出窗口


您如何在应用程序中实现此逻辑?

一种简单的方法是从以下位置使用忙指示灯:

下载二进制文件并将项目引用添加到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);
}