2013-03-24 7 views
9

Ich versuche, eine visuelle Darstellung von jedem Sortieralgorithmus zu erstellen, wo die Daten in einem int [] - Array dargestellt werden. Ein Beispiel für eine Blase Art auf wikipedia:Wie Canvas zu aktualisieren

Bubble sort from wikipedia

Meine Sortieralgorithmen alle hebt ein Ereignis ItemsSwapped, wenn zwei Elemente in dem int [] Array vertauscht. Ich versuche, die Daten nach jedem Ereignisse auf Leinwand angezeigt werden, dies ist mein Code:

// 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); 
} 

Das Problem ist, dass die Leinwand nicht selbst aktualisieren, es zeigt nur die endgültige Lösung nach einiger Zeit. Wie kann ich es nach jedem erhöhten Ereignis aktualisieren?

Bearbeiten - Ich versuchte mit UpdateLayout, InvalidateMeasure und Dispatcher-Objekt, aber keiner der beiden funktionierte.

Antwort

2

Vielleicht starten Sie Ihren Sortieralgorithmus auf dem UI-Thread, so dass es nicht bis zum Ende aktualisiert wird. Versuchen Sie, in einem anderen Thread zu sortieren, und aktualisieren Sie die Canvas-Kinder mit der Dispatcher, indem Sie Invoke oder BeginInvoke aufrufen.

Wenn Ihre ItemsSwapped Handler von einem separaten Thread aufgerufen wird, kann es so aussehen:

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