2012-03-05 30 views
1

我有一個標籤和畫布代表一個座標系統。在畫布中有一個節點,每次計算時都應該改變它的位置。這樣做直到滿足特定的停止標準。如何在每次迭代後更新GUI?

我也有一個包含筆記座標信息的標籤。我希望能夠在每次迭代時看到節點和標籤更新(每次計算完成)。

我看了一個調度程序,但是我的GUI只會在計算完成時更新。以下是我嘗試用Dispatcher爲標籤做的事情。

While(notDone = true){ 
//Calculations made here 

Application.Current.Dispatcher.BeginInvoke(
        DispatcherPriority.Background, 
        new Action(() => this.aLabel.Text = aString)); 
} 

我一直在尋找類似問題的解決方案和一些解決方案涉及到線程。我是否必須使用線程來更新我的GUI?

+3

做一個單獨的線程計算... – Yahia 2012-03-05 13:45:24

回答

0

剛剛創建委託和事件處理的信息改變

public delegate void SomeInfoChangeDelegate(object o); 
public event SomeInfoChangeDelegate InfoChangeEvent = null; 

分配監聽事件和啓動線程W /計算

InfoChangeEvent += new SomeInfoChangeDelegate(OnInfoChanged); 
Thread t = new Thread(new ParameterizedThreadStart(SomeWorkerThread)); 
t.Start(); 

製作的計算線程和事件偵聽器

void OnInfoChanged(object o) 
    { 
     // Update label 
    } 

    protected void SomeWorkerThread(object o) 
    { 
     int i = 0; 
     while(true) 
     { 
      if(i % 10 == 0) 
      { 
       if(InfoChangeEvent != null) 
       { 
        InfoChangeEvent(i); 
       } 
      } 
      Thread.Sleep(1000); 
      i++; 
     } 
    } 

並且不要忘記停止線程:)

+0

感謝您的所有答案!我結束了使用A.先生的想法,這完美地工作:) – user1249787 2012-03-05 15:13:29

0

如果您正在UI(主)線程中執行計算,它將無法處理消息,直到它們完成。將計算移至另一個線程並在每次迭代中通知主線程。

1

.Net有一個完全適合你的課程,我的朋友!

BackgroundWorker

做所有繁重的任務(你的循環)在DoWork的方法和更新ReportProgress你的GUI。 請參閱文檔以獲取幫助。

0

如果您使用WPF/Silverlight類實現INotifyPropertyChanged並將元素位置綁定到屬性。在RaisePropertyChanged(「PropName」)位置將被更改。

+0

不,但它不會動態呈現。在渲染之前,它們主線程(UI)上的所有處理都已完成。 – Paparazzi 2012-03-05 15:06:54