Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[WPF] Accedere alla UI da un thread secondario

Nicolò commentando il mio ultimo post mi ha chiesto di mostrare: "...un esempio in cui si accede da un thread secondario a quello che gestisce l'interfaccia utente?" niente di più facile! Per la (piccola) demo ho creato un'applicazione WPF, all'interno della Window ho inserito uno StackPanel con un TextBlock (da aggiornare) e due Button, il primo che mosta l'eccezione che viene scatenata se si prova ad accedere alla UI da un thread secondario ed il secondo che mostra come utilizzare la classe System.Windows.Threading.Dispatcher per accedere nella maniera corretta alla UI. Di seguito lo XAML:

<Window x:Class="AccessUIThreadDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" SizeToContent="WidthAndHeight">
    <StackPanel>
        <TextBlock x:Name="textBlock1">Text</TextBlock>
        <Button x:Name="NotCorrect" Click="NotCorrect_Click">Update (Not Correct)</Button>
        <Button x:Name="Correct" Click="Correct_Click">Update (Correct)</Button>
    </StackPanel>
</Window>

ed il codice (C#) contenuto nel code-behind:

   1: public partial class Window1 : Window
   2: {
   3:     public Window1()
   4:     {
   5:         InitializeComponent();
   6:     }
   7:  
   8:     private void NotCorrect_Click(object sender, RoutedEventArgs e)
   9:     {
  10:         var t = new Thread(new ThreadStart(() => { textBlock1.Text = "Updated"; }));
  11:         t.Start();
  12:     }
  13:  
  14:     private void Correct_Click(object sender, RoutedEventArgs e)
  15:     {
  16:         var t = new Thread(new ThreadStart(() =>
  17:         {
  18:             this.Dispatcher.Invoke(DispatcherPriority.Normal, 
  19:                 new Action(() => { textBlock1.Text = "Updated"; }));
  20:         }));
  21:         t.Start();            
  22:     }
  23: }

come è facile vedere dallo snippet di codice, basta usare il metodo Invoke passando la priorità ed il delegate (metodo) da invocare. Tale metodo verrà inserito nella coda gestita dal Dispatcher della Window WPF.

Print | posted on lunedì 26 maggio 2008 13:46 | Filed Under [ .NET ]

Powered by:
Powered By Subtext Powered By ASP.NET