列表类控件虚拟化

这篇具有很好参考价值的文章主要介绍了列表类控件虚拟化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WPF列表控件提供的最重要的功能是UI虚拟化(WPF编程宝典说的)。所有的WPF列表控件(所有继承自ItemsControl的控件,包括ListBox、CombBox、ListView、TreeView、DataGrid)都支持UI虚拟化。

UI虚拟化的支持实际上没有被构建到ListBox或ItemsControl类。而是通过VirtualizingStackPanel容器,除了增加虚拟化的支持,改面板与StackPanel面板功能类似。

ListBox、ListView、DataGrid都自动使用VirtualizingStackPanel面板来布局它们的子元素,所以不需要采取任何额外的步骤。

TreeView也是使用的VirtualizingStackPanel面板,但是默认情况下关闭了该支持,可以通过配置 VirtualizingStackPanel.IsVirtualizing="True" 来启用。

CombBox使用的是StackPanel面板,如果需要支持虚拟化,就必须明确的通过提供新的ItemsPanelTemplate 来添加虚拟化支持。

有一些因素会破坏UI虚拟化支持

1、在ScrollViewer中放置列表控件,ScrollViewer为其子内容提供了一个无限虚拟空间,在这个虚拟空间内,列表控件可以完整尺寸渲染自身,显示所有子项。只要将列表控件放入不会试图限制其尺寸的容器中,就会发生这一问题。例如将ListBox放入StackPanel或者设置Height为Auto的Grid行中。

2、改变列表控件的模板并且没有使用ItemsPresenter。 ItemsPresenter 使用 ItemsPanelTemplate,该模板指定了 VirtualizingStackPanel面板。如果破坏了这种关系或自己改变了ItemsPanelTemplate,从而不使用VirtualizingStackPanel面板,将会失去虚拟化特性。

3、不使用数据绑定。如果通过编程填充列表,那么不会发生虚拟化。

VirtualizingStackPanel面板的一些属性设置

1、启用虚拟化,也就是前面说到的TreeView控件启用虚拟化的方式,配置 VirtualizingStackPanel.IsVirtualizing="True"

2、项容器再循环,可以通过配置 配置 VirtualizingStackPanel.IsVirtualizing="True" .VirtualizationMode="Recyling" 来重复使用子项。

3、缓存长度,通过 VirtualizingStackPanel.CacheLength 与 VirtualizingStackPanel.CacheLengthUnit 来指定缓存长度。

4、滚动单位,通过配置 VirtualizingStackPanel.ScrollUnit 来指定滚动单位,可以是像素Pixel或是子项Item。

可以通过延迟滚动来进一步提升性能,开启延迟滚动后,在滚动滑块时不会更新列表显示,只有当用户释放滚动滑块时才刷新。通过配置 ScrollViewer.IsDeferredScrollingEnabled = "True" 开启

VirtualizationTest.xaml

<Window x:Class="DataBinding.VirtualizationTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="FastAndSlowComboBox" Height="300" Width="300" Loaded="Window_Loaded">
	<Grid Margin="5">
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="Auto"></ColumnDefinition>
			<ColumnDefinition></ColumnDefinition>
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions>
			<RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
		</Grid.RowDefinitions>
		<TextBlock Grid.Row="0" VerticalAlignment="Center">ComboBox:</TextBlock>
        <ComboBox Name="lstFast" Grid.Row="0" Grid.Column="1" Margin="5" ItemsSource="{Binding Path=Datas}" 
                  VirtualizingStackPanel.ScrollUnit="Pixel" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.CacheLength="100">
			<ComboBox.ItemsPanel>
				<ItemsPanelTemplate>
					<VirtualizingStackPanel></VirtualizingStackPanel>
				</ItemsPanelTemplate>
			</ComboBox.ItemsPanel>
		</ComboBox>
        <TextBlock Grid.Row="1" VerticalAlignment="Center">ListBox:</TextBlock>
        <ListBox Name="virtualListBox" Grid.Row="1" Grid.Column="1" Margin="5" ItemsSource="{Binding Path=Datas}" 
                 VirtualizingStackPanel.ScrollUnit="Pixel" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.CacheLength="100"/>


        <TextBlock Grid.Row="2" VerticalAlignment="Center">TreeView:</TextBlock>
        <TreeView Name="virtualTreeView" Grid.Row="2" Grid.Column="1" Margin="5" ItemsSource="{Binding Path=Datas}" VirtualizingStackPanel.IsVirtualizing="True"
                  VirtualizingStackPanel.ScrollUnit="Pixel" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.CacheLength="100" VirtualizingStackPanel.CacheLengthUnit="Item"/>

    </Grid>
</Window>

VirtualizationTest.xaml.cs文章来源地址https://www.toymoban.com/news/detail-680736.html

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace DataBinding
{
    /// <summary>
    /// Interaction logic for VirtualizationTest.xaml
    /// </summary>
    public partial class VirtualizationTest : Window
    {
        public VirtualizationTest()
        {
            InitializeComponent();
            DataContext = this;
        }

        private void InitData()
        {
            for (int i = 0; i < 10000; i++)
            {
                Datas.Add(i.ToString());
            }
        }
        public ObservableCollection<string> Datas { get; set; } = new ObservableCollection<string>();

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            InitData();
        }
    }
}

到了这里,关于列表类控件虚拟化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 01 openEuler虚拟化-KVM虚拟化简介

    1.1 简介 在计算机技术中,虚拟化是一种资源管理技术,它将计算机的各种实体资源(处理器、内存、磁盘、网络适配器等)予以抽象、转换后呈现,并可分割、组合为一个或多个计算机配置环境。这种资源管理技术打破了实体结构不可分割的障碍,使这些资源在虚拟化后不

    2023年04月26日
    浏览(73)
  • VM虚拟化——物理机迁移至虚拟化

    VMware vCenter Converter Standalone 【安装向导】  【最终用户专利协议】    【最终用户许可协议】  【安装位置】   【安装类型】默认本地安装 【用户体验设置】   【准备安装】 【转换机器】 【源主机】 填ip、用户名和密码  最好是用administrator的账号,不然可能权限不足。

    2024年01月25日
    浏览(41)
  • 云计算基础-计算虚拟化-CPU虚拟化

    在CPU的工作原理中,CPU有不同的指令集,如下图,CPU有4各指令集:Ring0-3,指令集是在服务器上运行的所有命令,最终都会在CPU上执行,但是CPU并不是说所有的命令都是一视同仁的,它会把命令分为不同的指令集 Ring0指令集称之为内核态指令集,改啊指令集里面啊运行的主要

    2024年02月20日
    浏览(42)
  • 虚拟化技术 — Libvirt 异构虚拟化管理组件

    Libvirt 是目前使用最为广泛的异构虚拟化管理工具,由 libvirt API 函数库、libvirtd Daemon 这 2 个关键部分组成,还具有一个默认命令行管理工具 virsh。 https://libvirt.org/ Libvirt 采用了面向驱动的架构设计,北向提供了统一的虚拟化资源管理 API,南向通过不同的驱动程序来对接异构

    2024年02月03日
    浏览(43)
  • 硬件辅助虚拟化 之EPT(内存虚拟化)介绍

           这篇内容,通过从操作系统的虚拟地址介绍到虚拟机层面的内存虚拟化技术,并介绍这两种技术之间的关联。        (以下实例都以intel 64位处理器和win10 x64操作系统位例。 ) 一、虚拟地址        在保护模式下,每个进程拥有自己独立的虚拟内存,程序的代

    2024年02月02日
    浏览(47)
  • 电脑如何查看是否支持虚拟化及如何开启虚拟化

    什么是虚拟化? Intel Virtualization Technology就是以前众所周知的“Vanderpool”技术(简称VT,中文译为虚拟化技术),这种技术可以让一个CPU工作起来就像多个CPU并行运行,从而使得在一部电脑内同时运行多个操作系统成为可能。在计算机技术中,虚拟化技术或者虚拟技术是一种资

    2024年02月05日
    浏览(55)
  • 云计算——内存虚拟化与I/O虚拟化

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录  前言 一.内存虚拟化  1.内存虚拟化类型 全虚拟化 半虚拟化 硬件辅助内存虚拟化  2.内存复用技术 3.内存复用Qos 4.内存复

    2024年02月16日
    浏览(44)
  • 【虚拟化qemu】(一)--- qemu 虚拟化软件介绍与安装

    本文主要用于记录关于 qemu 虚拟化软件的介绍和安装。 qemu(quick emulator)是一款可执行硬件虚拟化的(hardware virtualization)开源仿真器(Emulator)。 对于 qemu 的介绍可以查看该关于 qemu 的 wiki 词条链接。 于嵌入式行业 qemu 可以帮助开发者:学习裸机编程,RTOS 的编程,网络协

    2024年02月16日
    浏览(37)
  • 【虚拟化安全】虚拟化安全知识全攻略:保障云端数据安全

    通过虚拟化技术使不同用户的数据可以存储在物理存储上。这种方式不但可以节约存储空间,还可以进行统一管理,降低管理费用。随着虚拟化技术的大规模使用,组织机构数据中心的基础架构、运维管理等都发生重大变化,面临的安全风险也随之增加,变得更加复杂。 1.虚

    2024年03月24日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包