2014-04-30 55 views
0

在我的WPF應用程序我有一個for循環,之後點擊一個按鈕操縱一個Canvas控制。WPF帆布 - 添加/刪除子元素的「活」預覽

for (var i = 0; i < numOfIterations; i++) 
{ 
    swarm.iterate(); 
    myCanvas.Children.Clear(); 
    for (int j = 0; j < numCities - 1; j++) 
    { 
     Line line = new Line(); 
     line.Stroke = System.Windows.Media.Brushes.Black; 
     line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX); 
     line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX); 
     line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY); 
     line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY); 
     line.StrokeThickness = 2; 
     myCanvas.Children.Add(line); 
    } 
} 

正如你可能知道,在UI循環的執行期間不響應和循環結束後,最後一次迭代後的結果是可見的。我應該怎麼做才能對正在添加和刪除的行進行「實時」預覽?

我嘗試使用BackgroundWorker

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    double maxX = FindMaxX(); 
    double maxY = FindMaxY(); 
    for (int i = 0; i < 250; i++) 
    { 
     swarm.iterate(); 
     RemoveLines(); 
     for (int j = 0; j < cities.Count - 1; j++) 
     { 
      Line line = new Line(); 
      line.Stroke = System.Windows.Media.Brushes.Black; 

      line.X1 = ScaleX(cities[swarm._gbestlist[j]].x, maxX); 
      line.X2 = ScaleX(cities[swarm._gbestlist[j + 1]].x, maxX); 
      line.Y1 = ScaleY(cities[swarm._gbestlist[j]].y, maxY); 
      line.Y2 = ScaleY(cities[swarm._gbestlist[j + 1]].y, maxY); 

      line.StrokeThickness = 2; 
      myCanvas.Children.Add(line); 
     } 
    } 
} 

,但我得到

System.InvalidOperationException了用戶代碼未處理:因爲不同的線程 擁有它的 調用線程不能訪問該對象。

+0

添加元素異步... – user3455395

+0

做,在其他線程/任務('Invoke')或分循環到步驟,使用定時器通過他們的進步。 – Sinatr

+0

我試着用'BackgroundWorker'。請參閱編輯。好像我無法修改其他線程的UI元素。 – pmichna

回答

0

你仍然可以做到這一點異步使用的應用程序調度。此外,如果拆分迭代到使用作爲Sinatr提出了計時器的步驟,你可以得到預期的效果。

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new   
Action(DoWork) 

希望它有幫助。