2013-03-24 242 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,通過調用​​或BeginInvoke,在另一個線程中排序並更新Canvas子項。

如果您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]); 
      } 
     })); 
}