Dan*_*nny 7 .net c# wpf xaml wpfdatagrid
我正在开发一个应用程序,其中大量内容通过内置呈现给用户WPF DataGrid。这是我的DataGrid模样。除了RowDefinitions父母我什么都没做Grid。
<UserControl xmlns="blah blah blah">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid x:Name="dgrMaterialCollection"
IsReadOnly="True"
ItemsSource="{Binding Path=MyObservableCollection, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="True"
AutoGeneratingColumn="dgrMaterialCollection_AutoGeneratingColumn"
AutoGeneratedColumns="dgrMaterialCollection_AutoGeneratedColumns"
CanUserResizeColumns="True"
CanUserReorderColumns="True"
CanUserSortColumns="True"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.VirtualizationMode="Standard"
VirtualizingPanel.IsVirtualizing="True"
SelectionMode="Single"
SelectionUnit="FullRow"
ScrollViewer.CanContentScroll="False"
RowHeaderWidth="0"
Grid.Row="0"
RowHeight="32"
RowDetailsVisibilityMode="Collapsed">
<DataGrid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DataGridStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- A few value converters -->
</ResourceDictionary>
</DataGrid.Resources>
<!-- Some Manually Declared Columns -->
</DataGrid>
<StackPanel Grid.Row="1">
<SomeTextBoxes/>
</StackPanel>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
当我的应用程序显示时DataGrid,根据数据集的大小,大约有10-20秒的延迟。在此延迟期间,UI被锁定。加载数据网格后-我可以立即浏览所有数千个项目。当我说不出延迟时,我的意思是单击滚动条并使其以尽可能快的速度上下移动,在滚动行时呈现行没有延迟。似乎虚拟化无法正常工作,而是数据网格一次创建了所有行,而不是在用户滚动时创建所有行。
我的Datagrid嵌套在以下结构中(分布在多个xaml文件中)。有没有多余的ScrollViewers,StackPanels或任何东西。只是这个。
<RibbonWindow>
<Grid>
<ContentControl> <!-- Populated via a DataTemplate and ContentTemplateSelector -->
<UserControl>
<UserControl>
<UserControl>
<Grid>
<Here is the DataGrid>
Run Code Online (Sandbox Code Playgroud)
我尝试加快加载速度的一些方法
AutoGenerateColumns(没有影响)。DataGrid's RessourceDictionary(无区别)ObservableCollection使用异步/等待和其他多线程策略将项目加载到后台线程中。加载时间没有变化。ObservableCollection,然后将其设置为databound属性(这样就不会触发事件)ObservableCollection一项(每次添加都会触发事件)我知道延迟不是由引起的ObservableCollection。它在完全填充集合之后以及在WPF DataGrid渲染所有行/列时开始。我启用了虚拟化,并且仍然需要花费很多时间。我正在使用.NET Framework 4.5.1(因此4.6问题Virtualization不会引起此问题)。在排序(使用内置的数据网格排序)和从UI调整列大小时,也存在很长的延迟。
我在这里想念什么?我可以做些什么来确保Virtualization工作正常吗?有哪些事情可以加快这一步?如果我知道Virtualization工作正常,则可以采用新的策略,例如分页或某种延迟加载。我愿意使用的另一种解决方案是在呈现所有行时不阻止/冻结用户界面的解决方案。这样,用户至少可以在添加行时单击其他内容。