2011-06-28 77 views
-3

我有一個簡單的WPF應用程序。我需要從另一個線程更新控件。 這是我的代碼如何從另一個線程更新控件?

namespace WpfApplication1 
{ 
    class Stock 
    { 
     public int StockId { get; set; } 
     public string Name { get; set; } 
    } 

    class ThreadManager 
    { 
     public AddMoscowItem MoscowDelegate { get; set; } 
     public AddLondonItem LondonDelegate { get; set; } 
     public AddNewYorkItem NyDelegate { get; set; } 

     public ThreadManager() 
     { 
      InitStocks(); 
     } 

     private static readonly object lockObject = new object(); 

     private Stock[] stocks; 

     public ThreadManager(AddMoscowItem moscowDelegate, AddLondonItem londonDelegate, AddNewYorkItem nyDelegate) 
     { 
      MoscowDelegate = moscowDelegate; 
      LondonDelegate = londonDelegate; 
      NyDelegate = nyDelegate; 
     } 

     private void InitStocks() 
     { 
      if (stocks == null) 
       lock (lockObject) 
       { 
        if (stocks == null) 
         stocks = new Stock[] 
            { 
             new Stock() {Name = "Moscow", StockId = 1}, 
             new Stock() {Name = "London", StockId = 2}, 
             new Stock() {Name = "NY", StockId = 3} 
            }; 
       } 
     } 

     public void RunStocks() 
     { 
      //here we must call methods: AddMoscowListBoxItem, AddLondonListBoxItem 
      //how to do it linking to corresponding stock? 
     } 
    } 

    public delegate void AddMoscowItem(string msg); 
    public delegate void AddLondonItem(string msg); 
    public delegate void AddNewYorkItem(string msg); 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private AddMoscowItem moscowDelegate; 
     private AddLondonItem londonDelegate; 
     private AddNewYorkItem nyDelegate; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      moscowDelegate = AddMoscowListBoxItem; 
      londonDelegate = AddLondonListBoxItem; 
      nyDelegate = AddNYListBoxItem; 
      RunThreads(); 
     } 

     public void RunThreads() 
     { 
      ThreadManager stockThreads = new ThreadManager(moscowDelegate, londonDelegate, nyDelegate); 
      stockThreads.RunStocks(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 

     public void AddMoscowListBoxItem(string msg) 
     { 
      if (this.lbxMoscow.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxMoscow.Items.Add(msg); 
      } 
      else 
      { 
       lbxMoscow.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate { lbxMoscow.Items.Add(msg); 
                 return null; 
              }), null); 
      } 
     } 

     public void AddLondonListBoxItem(string msg) 
     { 
      if (this.lbxLondon.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxLondon.Items.Add(msg); 
      } 
      else 
      { 
       lbxLondon.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate 
              { 
               lbxLondon.Items.Add(msg); 
               return null; 
              }), null); 
      } 
     } 

     public void AddNYListBoxItem(string msg) 
     { 
      if (this.lbxNY.Dispatcher.Thread == Thread.CurrentThread) 
      { 
       lbxNY.Items.Add(msg); 
      } 
      else 
      { 
       lbxNY.Dispatcher.Invoke(DispatcherPriority.Background, new DispatcherOperationCallback(
              delegate 
              { 
               lbxNY.Items.Add(msg); 
               return null; 
              }), null); 
      } 
     } 
    } 
} 

任何建議都適合!

+0

問題是什麼? –

+0

我忘了創建線程,但在主題的問題。如何從另一個線程更新控件? – user818479

回答

4

WPF控件具有線程親和力,所以你不能從另一個線程更新它們的狀態。您必須使用控件的Dispatcher將更新編組到UI線程。例如,要更新文本框:

textBox.Dispatcher.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
     new Action(
     delegate() 
     { 
      textBox.Text = "Hello World"; 
     } 
    )); 
+1

我用它。看我的代碼。我不知道如何從另一個線程中創建的類調用這些方法 – user818479

+0

@ user818479您可以有一種方法來設置窗口上的文本 - 或者 - 您可以在返回文本框的窗口類上擁有一個屬性如果你需要做更多的事情而不僅僅是設置文本,那麼你需要去其他班級。這主要是你想要完成什麼的問題。你會相應地設計你的實現。 – Manfred