2011-01-10 60 views
0

我在我的应用程序中有一个网格。用户在对话框应用程序中选择一些文件进行一些计算后。当应用程序正在进行计算时,它看起来没有响应。如何显示一些图片,并使黑色&白色的主窗口计算?也许在MainWindow中做一些dp“IsBusy”,然后用图片绑定弹出窗口?wpf工作状态

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

回答

2

一个简单的方法是使用从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

1

您应该在单独的线程中执行长时间运行的任务以避免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); 
}