2013-03-24 4 views
9

데이터가 int [] 배열로 표시되는 정렬 알고리즘의 시각적 표현을 만들려고합니다. 위키에 거품 정렬의 예 :캔버스를 새로 고치는 방법

Bubble sort from wikipedia

내 정렬 알고리즘 모두 INT [] 어레이에 두 항목을 교환 할 때 이벤트 ItemsSwapped 올린다.

// Handler for ItemsSwapped event. 
private void Render(object sender, ItemsSwapEventArgs e) 
{ 
    canvas.Children.Clear(); 
    int numberOfElements = e.Data.Length; 

    for (int x = 0; x < numberOfElements; x++) 
    { 
     RenderValue(x, e.Data[x]); 
    } 
    // Here I should somehow refresh canvas. 
} 

private void RenderValue(int x, int y) 
{ 
    var value = new Ellipse 
        { 
         Width = 5, 
         Height = 5, 
         Stroke = Brushes.Black, 
         StrokeThickness = 2, 
        }; 
    Canvas.SetTop(value, x); 
    Canvas.SetLeft(value, y); 
    canvas.Children.Add(value); 
} 

문제는 캔버스 자체를 새로 고침하지 않는, 그냥 시간 후 최종 솔루션을 표시 나는 캔버스에 모든 이벤트 후 데이터를 표시하기 위해 노력하고, 이쪽은 내 코드입니다. 발생한 사건마다 어떻게 새로 고칠 수 있습니까?

편집 - UpdateLayout, InvalidateMeasure 및 Dispatcher 개체로 시도했지만 어느 것도 작동하지 않았습니다.

답변

2

UI 스레드에서 정렬 알고리즘을 시작하면 완료 될 때까지 업데이트되지 않을 수도 있습니다. 다른 스레드에서 정렬을 시도하고 Dispatcher을 사용하여 캔버스 자식을 업데이트하려면 Invoke 또는 BeginInvoke을 호출하십시오. 당신의 ItemsSwapped 핸들러가 별도의 스레드에서 호출 된 경우

, 그것은 다음과 같이 보일 수 있습니다 :

private void Render(object sender, ItemsSwapEventArgs e) 
{ 
    Dispatcher.Invoke((Action)(() => 
     { 
      canvas.Children.Clear(); 
      int numberOfElements = e.Data.Length; 

      for (int x = 0; x < numberOfElements; x++) 
      { 
       RenderValue(x, e.Data[x]); 
      } 
     })); 
} 
관련 문제