我发现了一个布局的奇怪问题。将Grid
RowDefinition
与Height=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
中的项目数成正比,内存永远保持分配状态。
答案 0 :(得分:3)
将RowDefinition.Height
设置为Auto
会将您的15000行ListView
置于“无限容器”中,从而有效地打破UI虚拟化,其中它可以获得所需的垂直大小,并且不受任何限制。这意味着所有15000 ListViewItem
都是有效创建的(不必要的,因为由于屏幕尺寸限制,它们不会显示在屏幕上)。
使用DockPanel
或保持高度不变:<RowDefinition/>
。