2013-03-24 4 views
9

Sto tentando di creare una rappresentazione visiva di qualsiasi algoritmo di ordinamento in cui i dati sono rappresentati in una matrice int []. Un esempio di bubble sort su wikipedia:Come aggiornare la tela

Bubble sort from wikipedia

miei ordinamento algoritmi tutti genera un evento ItemsSwapped quando due elementi nella int [] array sono invertiti. Sto cercando di visualizzare i dati dopo ogni evento su tela, questo è il mio codice:

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

Il problema è, che la tela non si aggiorna per sé, solo visualizza la soluzione finale dopo un certo tempo. Come posso aggiornarlo dopo ogni evento sollevato?

Modifica - Ho provato con oggetto UpdateLayout, InvalidateMeasure e Dispatcher, ma nessuno dei due ha funzionato.

risposta

2

Forse si avvia l'algoritmo di ordinamento sul thread dell'interfaccia utente, quindi non verrà aggiornato fino al completamento. Prova a ordinare in un'altra discussione e aggiorna i figli di Canvas usando Dispatcher, chiamando Invoke o BeginInvoke.

Se il gestore ItemsSwapped viene chiamato da un thread separato, può assomigliare a questo:

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