c# - 如何在标准 WPF ListView 中启用 UI 虚拟化

标签 c# wpf

我正在使用 .NET 4.5/VS2012,我有一个 ListView 看起来像这样

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

但性能仍然没有任何改善。我找到了一个使用 ListBox 的示例,但是如何虚拟化 ListView?我挣扎了很久。 我听说在以前版本的 WPF 中,分组时虚拟化是关闭的,但是在 .NET 4.5 中,WPF 有一个 IsVirtualizingWhenGrouping 属性,我已经将它设置为 True

更新:罪魁祸首是自定义样式,删除它后, ListView 像黄油一样流畅地运行

最佳答案

“UI 虚拟化仅在内存中存储可见项但在数据绑定(bind)场景中将整个数据结构存储在内存中。相比之下,数据虚拟化仅存储屏幕上可见的数据项在内存中。”

“默认情况下,当 ListView 和 ListBox 控件的列表项绑定(bind)到数据时,会启用 UI 虚拟化。”

For more info view the original MSDN source.

关于c# - 如何在标准 WPF ListView 中启用 UI 虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456075/

相关文章:

WPF 文本 block 性能不佳

wpf - 与在 WPF 中使用画笔相比,渲染大量重复图像的性能更高还是更低?

c# - 如何取消执行非托管 C++ 外部例程的任务

c# - 在 C# DLL 中为 COM INTEROP 注册 .tlb 文件时出错

c# - 将 InputGestureText 显示为 Button 的工具提示

c# - 如何在 wpf 应用程序中创建键盘输入?

c# - 用其他XAML文件中的网格替换内容WPF网格控件

c# - 如何使 autofac KeyFilter 在 asp.net-core web api 中工作?

c# - 继续打开 OpenFileDialog 直到选择有效文件

c# - 标签上的滚动条