ScrollViewer使用DataGrid降低了性能

时间:2011-08-31 08:22:36

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

我有以下情况:

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

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

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

2 个答案:

答案 0 :(得分:7)

这些问题的一个常见解决方法是在与DataGrid相同的行中添加一个不可见的“大小调整元素”,然后您可以将DataGrid.Height绑定到ActualHeight的{​​{1}}尺码元素。这样,您的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>

答案 1 :(得分:2)

外部ScrollViewer有效地为DataGrid提供了所需的空间,这样它的高度变得很大,一次显示所有行。只需通过在其上显式设置高度来限制DataGrid,例如。