在WPF网格中使用自动布局时,内存会增加

时间:2014-06-12 21:14:25

标签: c# wpf xaml

我发现了一个布局的奇怪问题。将Grid RowDefinitionHeight=Auto一起使用时,应用程序启动时需要更长时间,并且占用内存的5倍。我设法创建了一个示例应用程序来演示:

MainWindow.xaml

<Window x:Class="MemoryHog.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mh="clr-namespace:MemoryHog"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <mh:DataSource x:Key="DataSource"/> <!-- 15000 strings-->
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" /> <!-- "Auto" = 112mb, "22" = 22mb. Auto takes much longer to startup -->
        </Grid.RowDefinitions>
        <ListView Grid.Column="1" Grid.Row="0" Width="200" DataContext="{StaticResource DataSource}" ItemsSource="{Binding Items}"/>
        <StatusBar Grid.ColumnSpan="2" Grid.Row="1" />
    </Grid>
</Window>

DataSource.cs

using System;
using System.Collections.ObjectModel;

namespace MemoryHog
{
    class DataSource
    {
        public DataSource()
        {
            this.Items = new ObservableCollection<String>();

            for (int i = 0; i < 15000; ++i)
            {
                this.Items.Add(String.Format("{0}", i + 1));
            }
        }

        public ObservableCollection<String> Items { get; set; }
    }
}

查看我在MainWindow.xaml中的评论,如果您将RowDefinition.Height设置为Auto该应用将消耗112MB内存,但如果您将其更改为22,则应用只消耗22MB!这里发生了什么?这是一个错误吗?


编辑内存增加与ListView中的项目数成正比,内存永远保持分配状态。

1 个答案:

答案 0 :(得分:3)

RowDefinition.Height设置为Auto会将您的15000行ListView置于“无限容器”中,从而有效地打破UI虚拟化,其中它可以获得所需的垂直大小,并且不受任何限制。这意味着所有15000 ListViewItem都是有效创建的(不必要的,因为由于屏幕尺寸限制,它们不会显示在屏幕上)。

使用DockPanel或保持高度不变:<RowDefinition/>