WPF Toolkit numaralı telefondan DataGrid
kullanıyorum ve kılavuzun alt kısmında (yani son satır) odaklanmayı sürdürmem gerekiyor. Şu anda karşılaştığım sorun, satırlar eklendiğinde DataGrid
için kaydırma çubuğunun eklenecek yeni satırlarla birlikte kaydırılmamasıdır. Bunu başarmanın en iyi yolu nedir?WPF DataGrid - Yeni satırlar eklendikçe DataGrid'in alt kısmına nasıl odaklanılır?
cevap
DataGrid.ScrollIntoView(<item>)
, odağı DataGrid
'un alt kısmında tutacak gibi görünüyor.
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
.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]);
}
Bu yöntemi nerede kullanırsınız? – joe
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
Neden önce UpdateLayout() öğesini çağırmanız gerekiyor? Bunu yapmak zorunda değildim. Bir sebepten ötürü en iyi uygulama mı? –