如何能够在标准的ListView WPF UI虚拟化 [英] How to enable UI virtualization in Standard WPF ListView

查看:383
本文介绍了如何能够在标准的ListView WPF UI虚拟化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用.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>解决方案

文章将帮助你lot.Also可以看到。




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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆