2013-03-24 152 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]); 
      } 
     })); 
}