Wpf 窗口大小调整滞后于虚拟化列表框
我有一个使用基本MVVM原则创建的WPF应用程序 在我的一个视图中,我有一个Wpf 窗口大小调整滞后于虚拟化列表框,wpf,performance,xaml,Wpf,Performance,Xaml,我有一个使用基本MVVM原则创建的WPF应用程序 在我的一个视图中,我有一个ListBox控件。它绑定到我的ViewModel上的一个可观察集合 大致布局如下: <UserControl> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*
ListBox
控件。它绑定到我的ViewModel上的一个可观察集合
大致布局如下:
<UserControl>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding Students}"
ItemTemplate="{StaticResource Template_Student}" />
<ListBox ItemsSource="{Binding Logs}" />
</Grid>
</UserControl>
<DataTemplate x:Key="Template_Student">
<Grid Width="300" Height="85">
<Grid.RowDefinitions>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="3" Margin="5 10"
Height="65" Width="50"
Source="{Binding Property7}">
</Image>
<StackPanel Grid.Column="1" Margin="2 10 2 2">
<TextBlock>
<Run Text="{Binding Property4, StringFormat=\{0\}\,}" FontWeight="Bold" FontSize="14" />
<Run Text="{Binding Property5}" FontWeight="Bold" FontSize="14" />
<Run Text="{Binding Property6, StringFormat=(\{0\})}" />
</TextBlock>
<TextBlock>
<Run Text="Property1:" />
<Run Text="{Binding Property1}" />
</TextBlock>
<TextBlock>
<Run Text="Property2:" />
<Run Text="{Binding Property2}" />
</TextBlock>
<TextBlock>
<Run Text="Property3:" />
<Run Text="{Binding Property3, Mode=OneWay}" />
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
ListBox
使用默认的virtualzingstackpanel
,我通过Snoop确认它正在使用它,并且virtualzingstackpanel.isvirtualization
是真的
ViewModel的Students
属性中有大约1000个对象。没有那么重。大约11个启用了INPC的属性
在这种情况下,整个窗口的窗口重画会明显滞后
简单地恢复窗口大小或使其最大化会导致延迟超过一秒。向日志
属性(也是非常轻量级对象的可观察集合
)添加内容会导致窗口重画时延迟超过一秒
延迟似乎与两件事有关:
列表框中的项目数。如果我把它减到10
但是,滞后已经完全消失了。如果我做250个项目,它是
明显但不可怕。500开始变差,1000开始变差
实际数据集中的数字不可用李>
问题的复杂性
数据模板
。如果我同时删除图像
和堆栈面板
使用所有这些属性,性能会更好(类似于
100项(包含所有数据)。如果我在其中任何一个离开的话
表现又不好了
我想知道这是否与我选择的布局方式有关(例如,所有网格列定义的宽度为自动或*
)。或者如果我只是做了一些完全错误的事情,破坏了虚拟化
任何帮助都将不胜感激 我有几乎完全相同的情景。结果表明,即使没有自定义模板,WPF ListBox对>100个项目的性能也非常差
我不知道有任何开源或免费的替代方案,但我们尝试了(商业*)和它的替代品
它有一系列的优化,对我们来说性能的提高是巨大的。由于列表中有大约500个项目和自定义模板,调整窗口大小的速度过去慢得离谱。现在很顺利了
*我与Xceed没有任何关系