在ScrollViewer中使用WPF DataGrid虚拟化

在ScrollViewer中使用WPF DataGrid虚拟化,wpf,datagrid,virtualizingstackpanel,Wpf,Datagrid,Virtualizingstackpanel,我知道DataGrid支持虚拟化,所以它只为可见行创建网格单元。然而,这似乎只有在DataGrid的大小受到限制时才起作用 在我的场景中,DataGrid被放置在滚动查看器中,如下所示 <ScrollViever> <StackPanel> <more elements .../> <DataGrid ... /> <more elements .../> <

我知道DataGrid支持虚拟化,所以它只为可见行创建网格单元。然而,这似乎只有在DataGrid的大小受到限制时才起作用

在我的场景中,DataGrid被放置在滚动查看器中,如下所示

<ScrollViever>
    <StackPanel>

        <more elements .../>

        <DataGrid ... />

        <more elements .../>

    </StackPanel>
</ScrollViever>

这似乎打破了虚拟化。在DataGrid应该显示大量项目的情况下,可视化树变得非常非常大,甚至在外部ScrollViewer中向下滚动之前

有没有办法防止DataGrid预先创建所有单元格,而是在ScrollViewer向下滚动时创建这些单元格

编辑:基本上,这个页面应该像一个网页,顶部有一些文本,底部有一个大的表格和更多的文本。与dockview不同的是,整个页面应该滚动,而dockview的顶部/底部始终可见,并且只滚动网格。设置实现了这一点,但会受到预先创建的所有内容的影响


另一个编辑:是否有方法检测到datagrid的某一行被滚动到视图中?典型的延迟加载文章使用datagrid的scrollviewer向网格中添加更多的项目,这在这里不起作用。

是的,您回答了自己的问题。如果将DataGrid放置在ScrollViewer或StackPanel中,或者任何未将修复约束传递给DataGrid的控件中,则会破坏DataGrid中的虚拟化

您可以通过提供DataGrid.Width和DataGrid.Height固定值来修复此问题

您需要知道虚拟化的修复值。虚拟化需要修复

以下是如何为DataGrid提供固定大小:

只需将高度/宽度绑定到ScrollViewer或网格

<Grid x:Name="grid" >
   <ScrollViever>
       <StackPanel>

           <more elements .../>

           <DataGrid Width={Binding ElementName=grid, Path=Width..} Height={Binding ElementName...} />

           <more elements .../>

       </StackPanel>
   </ScrollViever>
<Grid>


就是这样:)

是的,你回答了你自己的问题。如果将DataGrid放置在ScrollViewer或StackPanel中,或者任何未将修复约束传递给DataGrid的控件中,则会破坏DataGrid中的虚拟化

您可以通过提供DataGrid.Width和DataGrid.Height固定值来修复此问题

您需要知道虚拟化的修复值。虚拟化需要修复

以下是如何为DataGrid提供固定大小:

只需将高度/宽度绑定到ScrollViewer或网格

<Grid x:Name="grid" >
   <ScrollViever>
       <StackPanel>

           <more elements .../>

           <DataGrid Width={Binding ElementName=grid, Path=Width..} Height={Binding ElementName...} />

           <more elements .../>

       </StackPanel>
   </ScrollViever>
<Grid>


就是这样:)

不要将它放在ScrollViewer中,它可以在那里拉伸到它想要的长度,这就是它的整个尺寸。

不要将它放在ScrollViewer中,它可以在那里拉伸到它想要的长度,这就是它的整个尺寸。

虚拟化StackPanel?但是虚拟化StackPanel(作为DataGrid的父级)是否使DataGrid仅生成其可见子级?我的理解是VirtualzingStackPanel将按需创建其子级,这意味着只要DataGrid的第一个顶级像素可见,整个DataGrid就可以创建?还是我遗漏了什么?刚刚测试:ScrollViewer VirtualzingStackPanel DataGrid无法解决问题。DataGrid仍将预生成其所有rowsAh,这是一个想法。我不知道有什么解决方案可以将额外的元素保留在StackPanel中,避免DataGrid显示自己的滚动条。StackPanel告诉它的孩子们他们可以使用无限高,所以DataGrid当然会使用它。如果是我,下一步我会尝试将DataGrid高度约束到StackPanel的高度,隐藏两个滚动条,创建一个新的滚动条,并将其绑定到控制StackPanel和DataGrid滚动位置的东西上,使其看起来正确。复杂。VirtualizangStackPanel?但是VirtualizangStackPanel(作为DataGrid的父级)会导致DataGrid只生成其可见的子级吗?我的理解是VirtualzingStackPanel将按需创建其子级,这意味着只要DataGrid的第一个顶级像素可见,整个DataGrid就可以创建?还是我遗漏了什么?刚刚测试:ScrollViewer VirtualzingStackPanel DataGrid无法解决问题。DataGrid仍将预生成其所有rowsAh,这是一个想法。我不知道有什么解决方案可以将额外的元素保留在StackPanel中,避免DataGrid显示自己的滚动条。StackPanel告诉它的孩子们他们可以使用无限高,所以DataGrid当然会使用它。如果是我,下一步我会尝试将DataGrid高度约束到StackPanel的高度,隐藏两个滚动条,创建一个新的滚动条,并将其绑定到控制StackPanel和DataGrid滚动位置的东西上,使其看起来正确。复杂。这样做的缺点是,我在scrollviewer效果中得到了一个不受欢迎的scrollviewer。用户很难与右侧的两个滚动条进行交互-一个滚动整个视图,另一个仅滚动视图中数据网格的行。嗯,…这是一个问题吗?我想你必须考虑改变UI设计吗?如果您在stackoverflow上发布长代码,您将获得滚动条,当然,默认的浏览器滚动条也是可见的。最后,你的处境与你的相似。答案是42:)我在开玩笑。但让我们再严肃一次。如果您希望为您的视图提供其他设计,请告知我是否可以提供帮助。:)这样做的缺点是,我在scrollviewer效果中得到了一个不受欢迎的scrollviewer。用户很难与右侧的两个滚动条进行交互-一个滚动整个视图,另一个仅滚动视图中数据网格的行。嗯,…这是一个问题吗?我想你必须考虑改变UI设计吗?如果您在stackoverflow上发布长代码,您将获得滚动条,当然,默认的浏览器滚动条也是可见的。到头来