如何能够在标准的ListView WPF UI虚拟化 [英] How to enable UI virtualization in Standard WPF ListView
问题描述
我使用.NET 4.5 / VS2012,我有一个ListView看起来像这样
< $的ListView b $ b VirtualizingPanel.IsContainerVirtualizable =真
VirtualizingPanel.IsVirtualizing =真
VirtualizingPanel.IsVirtualizingWhenGrouping =真
Grid.Row =1
NAME = eventLogList
保证金=5,0,5,0
BorderBrush =黑
了borderThickness =2
的ItemsSource ={结合EventLogs}
的SelectedItem ={结合SelectedEventLog}
当地时间:ListViewSorter.CustomListViewSorter =EventLogViewer.UI.EventLogItemComparer
的SelectionMode =单>
< ListView.GroupStyle>
< GroupStyle HidesIfEmpty =FALSE>
< GroupStyle.ContainerStyle>
<风格的TargetType =GroupItem>
< setter属性=模板>
< Setter.Value>
<的ControlTemplate的TargetType =GroupItem>
<扩展IsExpanded =真>
< Expander.Header>
< TextBlock的字号=20TextWrapping =包装保证金=0,10,0,5>
<&大胆GT;< TextBlock的文本={绑定名称}/>< /粗体> - < TextBlock的字号=20文本={结合ItemCount中}/>日志
< / TextBlock的>
< /Expander.Header>
< ItemsPresenter />
< /扩展>
< /控件模板>
< /Setter.Value>
< /二传手>
< /样式和GT;
< /GroupStyle.ContainerStyle>
< / GroupStyle>
< /ListView.GroupStyle>
< ListView.View>
<&GridView的GT;
< GridViewColumn
头=事件ID
WIDTH =120
DisplayMemberBinding ={结合事件ID}/>
< GridViewColumn
=头级别
WIDTH =160
DisplayMemberBinding ={结合水平}/>
< GridViewColumn
头=服务器
WIDTH =160
DisplayMemberBinding ={结合服务器}/>
< GridViewColumn
头=登录名
WIDTH =160
DisplayMemberBinding ={结合LOGNAME}/>
< GridViewColumn
头=源
WIDTH =240
DisplayMemberBinding ={绑定源}/>
< GridViewColumn
头=登录
WIDTH =240
DisplayMemberBinding ={结合已记录}/>
< / GridView的>
< /ListView.View>
< /&的ListView GT;
但仍然表现没有改善的。我发现使用列表框,但如何虚拟化一个ListView的例子吗?我挣扎了不少。
我听说有分组,虚拟化在以前版本的WPF的关闭,但在.NET 4.5,WPF有一个 IsVirtualizingWhenGrouping
属性,我已经设置到真
。
更新:罪魁祸首是定制造型,取出后,列表视图运行流畅像黄油
< DIV CLASS =h2_lin>解决方案
I'm using .NET 4.5/VS2012, and I have a ListView looks something like this
<ListView
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
Grid.Row="1"
Name="eventLogList"
Margin="5,0,5,0"
BorderBrush="Black"
BorderThickness="2"
ItemsSource="{Binding EventLogs}"
SelectedItem="{Binding SelectedEventLog}"
local:ListViewSorter.CustomListViewSorter="EventLogViewer.UI.EventLogItemComparer"
SelectionMode="Single">
<ListView.GroupStyle>
<GroupStyle HidesIfEmpty="False">
<GroupStyle.ContainerStyle>
<Style TargetType="GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GroupItem">
<Expander IsExpanded="True">
<Expander.Header>
<TextBlock FontSize="20" TextWrapping="Wrap" Margin="0,10,0,5" >
<Bold><TextBlock Text="{Binding Name}"/></Bold> - <TextBlock FontSize="20" Text="{Binding ItemCount}"/> logs
</TextBlock>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
<ListView.View>
<GridView>
<GridViewColumn
Header="event id"
Width="120"
DisplayMemberBinding="{Binding EventID}" />
<GridViewColumn
Header="level"
Width="160"
DisplayMemberBinding="{Binding Level}" />
<GridViewColumn
Header="server"
Width="160"
DisplayMemberBinding="{Binding Server}" />
<GridViewColumn
Header="log name"
Width="160"
DisplayMemberBinding="{Binding LogName}" />
<GridViewColumn
Header="source"
Width="240"
DisplayMemberBinding="{Binding Source}" />
<GridViewColumn
Header="logged"
Width="240"
DisplayMemberBinding="{Binding Logged}" />
</GridView>
</ListView.View>
</ListView>
But still the performance is not improving at all. I found an example using ListBox, but how to virtualize a ListView? I struggled quite a bit.
I heard that with grouping, the virtualization is turned off in previous version of WPF, but with .NET 4.5, WPF has a IsVirtualizingWhenGrouping
property, I already set it to True
.
Update: The culprit is custom styling, after removing it, the list view runs smoothly like butter
This article will help you a lot.Also can see..
这篇关于如何能够在标准的ListView WPF UI虚拟化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!