2013-03-24 6 views
9

データがint []配列で表されるソートアルゴリズムの視覚的表現を作成しようとしています。ウィキペディア上のバブルソートの例:キャンバスをリフレッシュする方法

Bubble sort from wikipedia

私のソートアルゴリズムのすべての型はint []配列内の2つの項目が交換されたときにイベントが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を使用してCanvasの子を更新するには、​​または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]); 
      } 
     })); 
}