2013-03-19 2 views
0

Je crée ce programme simple dans WPF (pas Windows Forms), c'est pour une affectation à l'université. Le programme a deux boutons et une liste. Lorsque le programme démarre, le premier bouton est activé tandis que le second est désactivé. Lorsque l'utilisateur clique sur le premier bouton, une boîte de dialogue s'ouvre avec un bouton "OK". Lorsque le bouton "OK" est cliqué, il obtient tous les noms de fichiers d'un répertoire et l'affiche dans une liste. Mais ceci est fait en utilisant un worker d'arrière-plan donc la listbox ajoute les fichiers au fur et à mesure que les fichiers sont trouvés. Maintenant, ce que je veux faire, c'est qu'APRÈS le travail d'arrière-plan a terminé son travail, c'est-à-dire, énumérés tous les fichiers dans le répertoire, je veux activer le second bouton activé qui était précédemment désactivé. Je connais la syntaxe pour activer ou désactiver les boutons, vous définissez true ou false à la propriété .IsEnabled. Par exemple:Activer le bouton après que le travailleur en arrière-plan est terminé (C#)

//this will disable the button 
    buttonName.IsEnabled = false; 

Mais ce que je veux savoir comment et où dois-je utiliser cette propriété (ce code supplémentaire ai-je besoin) pour que le deuxième bouton est activé seulement après que le travailleur de fond a entièrement rempli son travail . Avec mon code actuel, ce qui se passe est que le deuxième bouton est activé dès que le bouton "OK" est cliqué et dès que le travailleur d'arrière-plan démarre. Dans le code ci-dessous, "btnSort" est le nom du deuxième bouton qui doit être activé après que le travail d'arrière-plan est terminé. Vous pourriez probablement ignorer la méthode DirSearch à la fin, c'est juste une méthode pour obtenir des fichiers à partir d'un répertoire. Je sais qu'il existe d'autres moyens de rechercher des répertoires, mais on m'a dit d'utiliser cette méthode.

public partial class MainWindow : Window 
    { 
     BackgroundWorker backgroundWorker; 

     string sourcePath = ""; 

     List<string> list1 = new List<string>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      backgroundWorker = new BackgroundWorker(); 
      backgroundWorker.WorkerReportsProgress = true; 
      //take this out if cancel not used 
      backgroundWorker.WorkerSupportsCancellation = true; 
      backgroundWorker.DoWork += 
       new DoWorkEventHandler(backgroundWorker_DoWork); 
      backgroundWorker.ProgressChanged += 
       new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); 
     }  


     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog(); 
       folderDialog.SelectedPath = @"C:\temp"; 
       System.Windows.Forms.DialogResult result = folderDialog.ShowDialog(); 

       if (result.ToString() == "OK") 
       { 
        if (listBox1.Items.Count != 0) 
        { 
         listBox1.Items.Clear(); 
        } 

        if (list1.Count != 0) 
        { 
         list1.Clear(); 
        } 

        sourcePath = folderDialog.SelectedPath; 

        backgroundWorker.RunWorkerAsync(sourcePath); 

        if (btnSort.IsEnabled == false) 
        { 
         btnSort.IsEnabled = true; 
        }     
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      }  
     } 

     private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      DirSearch(e.Argument.ToString()); 
      MessageBox.Show("Complete!"); 
     } 

     private void backgroundWorker_ProgressChanged(object sender, 
     ProgressChangedEventArgs e) 
     { 
      FileFetchState state = (FileFetchState)e.UserState; 
      listBox1.Items.Add(state.FetchedFile); 

     } 

     public class FileFetchState 
     { 
      public string FetchedFile 
      { 
       get; 
       set; 
      } 

      public FileFetchState(string fetchedFile) 
      { 
       FetchedFile = fetchedFile; 
      } 
     } 

     public void DirSearch(string sourcePath) 
     { 
      try 
      { 
       foreach (string f in Directory.GetFiles(sourcePath)) 
       { 
        string fileName = System.IO.Path.GetFileName(f); 

        if (!listBox1.Items.Contains(fileName)) 
        { 
         //code for adding to list1 
         list1.Add(fileName); 

         backgroundWorker.ReportProgress(0, 
          new FileFetchState(fileName)); 

         System.Threading.Thread.Sleep(1); 
        } 
       } 
       foreach (string d in Directory.GetDirectories(sourcePath)) 
       { 
        DirSearch(d); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+0

gars Passons sur. Je l'ai compris. il faut juste utiliser BackgroundWorker.RunWorkerCompleted –

Répondre

Questions connexes