【问题标题】:ScrollViewer slow performance with DataGridScrollViewer 使用 DataGrid 时性能下降
【发布时间】:2011-11-07 10:27:34
【问题描述】:

我有以下场景:

<ScrollViewer>
    <Grid>
         <!--many other controls-->
         <DataGrid />
    </Grid>
</ScrollViewer>

现在,当我将 DataGrid 绑定到大量数据(大约 10.000 行)时,我的性能非常缓慢。事实上,我得到 OutOfmemory 异常(我有 8 GB 内存)!我在某处读到这是因为 ScrollViewer 覆盖了 DataGrid 虚拟化(或类似的东西),但我不知道如何防止这种情况。如果我删除 ScrollViewer,问题就解决了!数据在不到一秒的时间内加载。

我想保留 ScrollViewer(因为其他控件)并具有良好的性能。那可能吗?如果没有,还有其他解决方法吗?

【问题讨论】:

    标签: c# wpf performance xaml .net-4.0


    【解决方案1】:

    外部的 ScrollViewer 有效地为 DataGrid 提供了尽可能多的空间,这样它的高度就会变得很大,同时显示所有行。例如,只需通过显式设置高度来限制 DataGrid。

    【讨论】:

    • 其实这不是最好的解决方案。如果我现在调整窗口大小,DataGrid 将不会调整大小。
    • @Vale:正如我所说,这只是一个示例,您只需要限制大小,我不会将 DataGrid 放在 ScrollViewer 中,而是放在其中一个网格单元中。
    • DataGrid 在网格单元格中,但孔网格在 ScrollViewer 内部。
    • @Vale:您应该只将 ScrollViewer 放在其他控件的网格单元中。
    • 为什么要将 ScrollViewer 放在单元格中?我希望我的洞窗可以滚动,所以我把它放在网格周围。网格是窗口的内容。
    【解决方案2】:

    解决此类问题的常见解决方法是在DataGrid 所在的同一行中添加一个不可见的“尺寸调整元素”,然后您可以将DataGrid.Height 绑定到尺寸调整元素的ActualHeight。这样,您的DataGrid 将始终使用RowDefinition 的高度。示例

    <ScrollViewer>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Button Content="Some Control.." />
            <Rectangle Name="sizingElement"
                       Grid.Row="1"
                       Fill="Transparent"
                       Margin="1"/>
            <DataGrid Grid.Row="1"
                      Height="{Binding ElementName=sizingElement,
                                       Path=ActualHeight, FallbackValue=1}">
                <!--...-->
            </DataGrid>
            <Button Content="Some more controls etc.." Grid.Row="2"/>
        </Grid>
    </ScrollViewer>
    

    【讨论】:

    • 这是我一直在寻找的解决方案。非常感谢。
    • @Vale:我不明白,除非 DataGrid 降低到 0 的高度,否则外部滚动查看器不再执行任何操作。你为什么想要这样的东西?
    • @H.B.:它也可能取决于其他因素。如果您有 Auto、*、Auto 等三行,并将 DataGrid 放在中间行,MinHeight 为 100,最后一行的高度可以是 10 到 1000 之间的任意位置的控件,外部 @987654329 @ 滚动 Controls 如果需要,DataGrid ScrollViewer 滚动 DataGrid
    • @Meleak:嗯,好点子。但我不禁认为必须有更好的方法来做到这一点,我已经为各种事情使用了实际大小的绑定,但这对我来说似乎有点不合适......
    • 出色的解决方法。这解决了一个让我发疯的类似设置。
    猜你喜欢
    • 2012-06-23
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2012-05-16
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多