0
내 WPF 응용 프로그램에서 나는 버튼 클릭 후 Canvas
컨트롤을 조작하는 for
루프를 가지고 있습니다.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