2009-08-18 13 views

risposta

6

Sembra che DataGrid.ScrollIntoView(<item>) manterrà l'attenzione sul fondo dello DataGrid.

+1

Dove si chiama questo metodo? – joe

+0

lo fa. Basta effettuare una chiamata dopo aver aggiornato l'origine dati con il nuovo elemento. Assicuratevi di chiamare UpdateLayout() prima di ScrollIntoView! – Vinzz

+2

Perché è necessario chiamare prima UpdateLayout()? Non ho dovuto farlo. È solo una buona pratica per qualche motivo? –

4

Questo è un approccio semplice utilizzando evento LoadingRow:

void dataGrid_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e) 
{ 
    dataGrid.ScrollIntoView(e.Row.Item); 
} 

Basta ricordarsi di disattivare dopo il caricamento della griglia è finito.

5

Ho trovato che il momento più utile per chiamare il metodo ScrollIntoView proviene dall'evento associato ScrollViewer.ScrollChanged. Questo può essere impostato in XAML come segue:

<DataGrid 
... 
ScrollViewer.ScrollChanged="control_ScrollChanged"> 

L'oggetto ScrollChangedEventArgs ha diverse proprietà che possono essere utili per il calcolo il layout e la posizione (estensione, Offset, Finestra) scorrere. Si noti che questi sono in genere misurati in numero di righe/colonne quando si utilizzano le impostazioni di virtualizzazione DataGrid predefinite.

Ecco un'implementazione di esempio che mantiene l'elemento in fondo in vista quando vengono aggiunti nuovi elementi a DataGrid, a meno che l'utente non sposti la barra di scorrimento per visualizzare gli elementi più in alto nella griglia.

private void control_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     // If the entire contents fit on the screen, ignore this event 
     if (e.ExtentHeight < e.ViewportHeight) 
      return; 

     // If no items are available to display, ignore this event 
     if (this.Items.Count <= 0) 
      return; 

     // If the ExtentHeight and ViewportHeight haven't changed, ignore this event 
     if (e.ExtentHeightChange == 0.0 && e.ViewportHeightChange == 0.0) 
      return; 

     // If we were close to the bottom when a new item appeared, 
     // scroll the new item into view. We pick a threshold of 5 
     // items since issues were seen when resizing the window with 
     // smaller threshold values. 
     var oldExtentHeight = e.ExtentHeight - e.ExtentHeightChange; 
     var oldVerticalOffset = e.VerticalOffset - e.VerticalChange; 
     var oldViewportHeight = e.ViewportHeight - e.ViewportHeightChange; 
     if (oldVerticalOffset + oldViewportHeight + 5 >= oldExtentHeight) 
      this.ScrollIntoView(this.Items[this.Items.Count - 1]); 
    }