2014-04-30 2 views
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 사용자 코드에 의해 처리되지 않은했다 얻을 : 다른 스레드 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다.

+0

요소를 비동기 적으로 추가하십시오 ... – user3455395

+0

다른 스레드/작업 (Invoke와 함께) 또는주기를 단계로 나누고 타이머를 사용하여 단계를 진행하십시오. – Sinatr

+0

'BackgroundWorker'를 사용해 보았습니다. 제발, 편집을 참조하십시오. 다른 스레드에서 UI 요소를 수정할 수없는 것 같습니다. – pmichna

답변

0

여전히 응용 프로그램 디스패처를 사용하여 비동기 적으로 수행 할 수 있습니다. 또한 Sinatr이 제안한대로 타이머를 사용하여 반복을 단계로 나눈다면 원하는 효과를 얻을 수 있습니다.

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

희망이 있습니다.