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了用戶代碼未處理:因爲不同的線程 擁有它的 調用線程不能訪問該對象。
添加元素異步... – user3455395
做,在其他線程/任務('Invoke')或分循環到步驟,使用定時器通過他們的進步。 – Sinatr
我試着用'BackgroundWorker'。請參閱編輯。好像我無法修改其他線程的UI元素。 – pmichna