2013-10-24 25 views
0

我有一個小應用程序,應該根據一些測試將圖像設置爲紅色或綠色。測試可能需要幾秒鐘,並且每個人都有一個自定義控件,並且圖像連接到它。當我點擊開始時,我想要完成第一個測試,通過改變那個圖像來顯示結果,然後繼續。但就目前而言,所有的測試都已經完成(可能是10秒),然後所有的燈都在同時改變。如何強制自定義控件在執行期間更新圖像?在執行期間重畫圖像WPF

private void start_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (TestObject tObj in tObjList) 
     { 
      bool testResult = tObj.makeTest(); 
      foreach (TestShower ts in m_TSList) 
      { 
       if (tObj == ts.gettObj()) 
       { 
        if (testResult == true) 
         ts.setLightOn(); 
        else 
         ts.setLightOff(); 

        ts.UpdateLayout(); 
        break; 
       } 
      } 
     } 
    }  

public void setLightOn() 
    { 
     string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_On.png"); 
     BitmapImage img = new BitmapImage(new Uri(strUri2)); 
     iStatus.Source = null; 
     iStatus.Source = img; 
    } 

public void setLightOff() 
    { 
     string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_Off.png"); 
     BitmapImage img = new BitmapImage(new Uri(strUri2)); 
     iStatus.Source = null; 
     iStatus.Source = img; 
    } 

回答

0

你應該讀入異步和等待,並在同一時間內完成每個測試和等待的結果(當然這是假設你的測試不是interdependant)

和某種形式實現的

Task.Factory.StartNew(() => { 
var result = ts.makeTest(); 
setLight1(result); 

}) 

雖然不知道它越會看起來好像你可以執行此使用數據綁定到對測試對象的List實現INotifyPropertyChanged一個視圖模型。

但不是異步執行的測試是你的問題的主要原因

我知道外部鏈接是不是真的在SO首選,但這裏是一個教程

http://www.youtube.com/watch?v=ZyFL3hjHADs

+0

我會這樣做的!謝謝! – Nick3

0

在後臺運行的測試,然後使用調度程序來更新UI線程: 對於WPF &網4.5。您可以使用TPL

private void start_Click(object sender, RoutedEventArgs e) 
{ 
    Task.Run(()=>{ 
    foreach (TestObject tObj in tObjList) 
    { 
     bool testResult = tObj.makeTest(); 
     Dispatcher.Invoke(()=>{ 
     foreach (TestShower ts in m_TSList) 
     { 
      if (tObj == ts.gettObj()) 
      { 
       if (testResult == true) 
        ts.setLightOn(); 
       else 
        ts.setLightOff(); 

       ts.UpdateLayout(); 
       break; 
      } 
     }}); 
     } 
    } 
    }); 
}  
+0

感謝,會考慮這! – Nick3