WPF DataGrid似乎没有虚拟化行

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文件中)。有没有多余的ScrollViewersStackPanels或任何东西。只是这个。

<RibbonWindow>
  <Grid>
    <ContentControl> <!-- Populated via a DataTemplate and ContentTemplateSelector -->
      <UserControl>
        <UserControl>
          <UserControl>
            <Grid>
              <Here is the DataGrid> 
Run Code Online (Sandbox Code Playgroud)

我尝试加快加载速度的一些方法

  • 明确设置所有列的宽度(比我的加载时间缩短了约10秒)
  • 已关闭AutoGenerateColumns(没有影响)。
  • 禁用中设置的样式DataGrid's RessourceDictionary(无区别)
  • ObservableCollection使用异步/等待和其他多线程策略将项目加载到后台线程中。加载时间没有变化。
  • 将项目添加到新的项目ObservableCollection,然后将其设置为databound属性(这样就不会触发事件)
  • 一次添加ObservableCollection一项(每次添加都会触发事件)
  • 打开和关闭虚拟化不会影响加载时间。

我知道延迟不是由引起的ObservableCollection。它在完全填充集合之后以及在WPF DataGrid渲染所有行/列时开始。我启用了虚拟化,并且仍然需要花费很多时间。我正在使用.NET Framework 4.5.1(因此4.6问题Virtualization不会引起此问题)。在排序(使用内置的数据网格排序)和从UI调整列大小时,也存在很长的延迟。

我在这里想念什么?我可以做些什么来确保Virtualization工作正常吗?有哪些事情可以加快这一步?如果我知道Virtualization工作正常,则可以采用新的策略,例如分页或某种延迟加载。我愿意使用的另一种解决方案是在呈现所有行时不阻止/冻结用户界面的解决方案。这样,用户至少可以在添加行时单击其他内容。

Dan*_*nny 5

ScrollViewer.CanContentScroll对价值DataGrid元素必须设置为True以正确的行虚拟化的工作。这里解释了为什么必须这样设置。

感谢ChrisW在关于这个问题的评论中发现了这一点。

  • 我认为您的意思是“必须设置为 **True**”? (3认同)