2009-08-18 21 views

cevap

6

DataGrid.ScrollIntoView(<item>), odağı DataGrid'un alt kısmında tutacak gibi görünüyor.

+1

Bu yöntemi nerede kullanırsınız? – joe

+0

yapar. Sadece veri kaynağınızı yeni öğe ile güncelledikten sonra bir çağrı yapın. ScrollIntoView'dan önce UpdateLayout() öğesini çağırdığınızdan emin olun! – Vinzz

+2

Neden önce UpdateLayout() öğesini çağırmanız gerekiyor? Bunu yapmak zorunda değildim. Bir sebepten ötürü en iyi uygulama mı? –

4

Bu LoadingRow olayı kullanarak basit bir yaklaşımdır: ızgara yükleme tamamlandıktan sonra

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

Sadece devre dışı bırakmayı unutmayın

.

5

ScrollIntoView yöntemini çağırmak için en yararlı sürenin ScrollViewer.ScrollChanged ekli etkinliğinden olduğunu buldum. Bu aşağıdaki gibi XAML ayarlanabilir:

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

ScrollChangedEventArgs nesne düzenini hesaplamak için yararlı olabilir ve pozisyon (Kapsamının, Ofset, Görünüm) kaydırabilirsiniz çeşitli özellikleri vardır. Varsayılan DataGrid sanallaştırma ayarlarını kullanırken bunların tipik olarak satır/sütun sayılarıyla ölçüldüğünü unutmayın.

Kullanıcı, ızgaradaki öğeleri görüntülemek için kaydırma çubuğunu hareket ettirmedikçe, DataGrid'e yeni öğeler eklendikçe alt öğeyi görüntüleyen bir örnek uygulamadır.

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