【发布时间】:2019-12-01 05:02:27
【问题描述】:
我有一个 Wpf DataGrid,用户可以通过单击任何标题进行排序,然后滚动。 有些单元格需要显示图像,但我想避免在填充 DataGrid 时加载所有图像。我希望仅在图像进入视野时才加载图像。 当单元格进入视野时如何通知我,以及如何获取其有界项?
【问题讨论】:
标签: c# wpf sorting scroll datagrid
我有一个 Wpf DataGrid,用户可以通过单击任何标题进行排序,然后滚动。 有些单元格需要显示图像,但我想避免在填充 DataGrid 时加载所有图像。我希望仅在图像进入视野时才加载图像。 当单元格进入视野时如何通知我,以及如何获取其有界项?
【问题讨论】:
标签: c# wpf sorting scroll datagrid
我最终得到了这个解决方案: 监听 DataGrid 的 ScrollViewer.ScrollChanged 事件:
<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged">
然后,使用 scrollviewer 属性来检测可见行;最后使用 DataGrid 的 ItemContainerGenerator 来获取与感兴趣的每一行关联的项目。
private static T GetChildOfType<T>(DependencyObject depObj)
where T : DependencyObject
{
if (depObj == null) return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}
private void DataGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scroll = GetChildOfType<ScrollViewer>((DependencyObject)sender);
int firstRow = (int)scroll.VerticalOffset;
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;
DataGrid datagrid = sender as DataGrid;
for (int i = firstRow; i < lastRow; i++)
{
var row = datagrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (row != null)
{
var item = row.DataContext;
ItemViewModel viewModel = item as ItemViewModel;
if (viewModel != null)
{
viewModel.LoadImages().ContinueWith(t => { });
}
}
}
}
【讨论】:
尝试将EnableDataVirtualization="True" 设置为DataGrid
【讨论】: