2011-01-10 5 views
0

J'ai une grille dans mon application. Après que l'utilisateur sélectionne certains fichiers dans l'application ofdialog, certains calculs sont effectués. Pendant que l'application fait des calculs, il semble qu'elle ne répond pas. Comment afficher une image et faire la fenêtre principale en noir & blanc tout en calculant? Peut-être faire un peu de dp dans MainWindow à la "IsBusy" et lier une popup avec l'image à elle?wpf état de travail

Comment implémentez-vous cette logique dans vos applications?

Répondre

2

Un moyen facile est d'utiliser l'indicateur occupé de Extended WPF Toolkit:

TELECHARGEMENT les binaires et ajouter une référence de projet à WPFToolkit.Extended.dll.

add suivant l'espace de noms dans votre « fenêtre principale »:

xmlns:ext="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended" 

Puis ajouter l'indicateur occupé dans la vue (le placer de sorte que lorsque montré, il occupera tout l'écran) Voici ma fenêtre principale a deux lignes et je veux que le contrôle s'étende sur les deux lignes. La propriété IsBusy du contrôle est liée à une propriété booléenne dans le contexte de données de la vue. Le calcul de longue durée doit être traité dans un autre thread afin qu'il ne bloque pas l'interface utilisateur. Pour le filetage, vous pouvez utiliser BackgroundWorker class.

1

Vous devez exécuter les tâches longues dans un thread séparé afin d'éviter le blocage de l'interface utilisateur. est ici d'une manière que vous pourriez réaliser que:

Définir fil de fond comme ci-dessous:

//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 
     } 
} 

et l'appeler comme ci-dessous:

private void UpDateProgressLabel(string s) 
{ 
    this.Dispatcher.BeginInvoke((Action)delegate 
     { 
      NotificationLabel.Content = s; 
     }); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    StartLongRunningWork(UpDateProgressLabel); 
} 
Questions connexes