title: wpf BackgroundWorker - Regarding updating UI
body: <p>I use a browse for files dialog to allow a user to select multiple images. If a lot of images are selected, as expected it takes a bit. Below is an example of what I do with the selected images. I loop through the filepaths to images and create an instance of a user control, the user control has an Image control and a few other controls. I create the instance of this control then add it to a existing stackPanel created in the associating window xaml file. The example just below works fine, but I'm trying to understand BackGroundWorker better, I get the basics of how to set it up, with it's events, and pass back a value that could update a progress bar, but because my loop that takes up time below adds the usercontrol instance to an existing stackPanel, It won't work, being in a different thread. Is BackGroundWorker something that would work for an example like this? If so, what's the best way to update the ui (my stackpanel) that is outside the thread. I'm fairly new to wpf and have never used the BackGroundWorker besides testing having it just update progress with a int value, so I hope this question makes sense, if I'm way off target just let me know. Thanks for any thoughts.</p>
  
  <p>Example of how I'm doing it now, which does work fine.</p>
  
  <pre><code>protected void myMethod(string[] fileNames) {  
      MyUserControl uc;  
  
      foreach (String imagePath in fileNames) {  
          uc = new MyUserControl();  
          uc.setImage(imagePath);  
          stackPanel.Children.Add(uc);  
          progressBar.Value = ++counter;  
          progressBar.Refresh();  
      }  
  }    
  </code></pre>
  
  <p>below this class i have this so I can have the progressBar refresh:</p>
  
  <pre><code>public static class extensionRefresh {  
      private static Action EmptyDelegate = delegate() { };  
  
      public static void Refresh(this UIElement uiElement) {  
          uiElement.Dispatcher.Invoke(DispatcherPriority.Background, EmptyDelegate);  
      }  
  }
  </code></pre>