做织梦网站之前要新建数据库吗,韩城市住房和城乡建设局网站,天河定制型网站建设,wordpress文章页面添加打赏WPF列表控件提供的最重要的功能是UI虚拟化#xff08;WPF编程宝典说的#xff09;。所有的WPF列表控件#xff08;所有继承自ItemsControl的控件#xff0c;包括ListBox、CombBox、ListView、TreeView、DataGrid#xff09;都支持UI虚拟化。
UI虚拟化的支持实际上没有被构…WPF列表控件提供的最重要的功能是UI虚拟化WPF编程宝典说的。所有的WPF列表控件所有继承自ItemsControl的控件包括ListBox、CombBox、ListView、TreeView、DataGrid都支持UI虚拟化。
UI虚拟化的支持实际上没有被构建到ListBox或ItemsControl类。而是通过VirtualizingStackPanel容器除了增加虚拟化的支持改面板与StackPanel面板功能类似。
ListBox、ListView、DataGrid都自动使用VirtualizingStackPanel面板来布局它们的子元素所以不需要采取任何额外的步骤。
TreeView也是使用的VirtualizingStackPanel面板但是默认情况下关闭了该支持可以通过配置 VirtualizingStackPanel.IsVirtualizingTrue 来启用。
CombBox使用的是StackPanel面板如果需要支持虚拟化就必须明确的通过提供新的ItemsPanelTemplate 来添加虚拟化支持。
有一些因素会破坏UI虚拟化支持
1、在ScrollViewer中放置列表控件ScrollViewer为其子内容提供了一个无限虚拟空间在这个虚拟空间内列表控件可以完整尺寸渲染自身显示所有子项。只要将列表控件放入不会试图限制其尺寸的容器中就会发生这一问题。例如将ListBox放入StackPanel或者设置Height为Auto的Grid行中。
2、改变列表控件的模板并且没有使用ItemsPresenter。 ItemsPresenter 使用 ItemsPanelTemplate该模板指定了 VirtualizingStackPanel面板。如果破坏了这种关系或自己改变了ItemsPanelTemplate从而不使用VirtualizingStackPanel面板将会失去虚拟化特性。
3、不使用数据绑定。如果通过编程填充列表那么不会发生虚拟化。
VirtualizingStackPanel面板的一些属性设置
1、启用虚拟化也就是前面说到的TreeView控件启用虚拟化的方式配置 VirtualizingStackPanel.IsVirtualizingTrue
2、项容器再循环可以通过配置 配置 VirtualizingStackPanel.IsVirtualizingTrue .VirtualizationModeRecyling 来重复使用子项。
3、缓存长度通过 VirtualizingStackPanel.CacheLength 与 VirtualizingStackPanel.CacheLengthUnit 来指定缓存长度。
4、滚动单位通过配置 VirtualizingStackPanel.ScrollUnit 来指定滚动单位可以是像素Pixel或是子项Item。 可以通过延迟滚动来进一步提升性能开启延迟滚动后在滚动滑块时不会更新列表显示只有当用户释放滚动滑块时才刷新。通过配置 ScrollViewer.IsDeferredScrollingEnabled True 开启
VirtualizationTest.xaml
Window x:ClassDataBinding.VirtualizationTestxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlTitleFastAndSlowComboBox Height300 Width300 LoadedWindow_LoadedGrid Margin5Grid.ColumnDefinitionsColumnDefinition WidthAuto/ColumnDefinitionColumnDefinition/ColumnDefinition/Grid.ColumnDefinitionsGrid.RowDefinitionsRowDefinition HeightAuto/RowDefinitionRowDefinition Height*/RowDefinitionRowDefinition Height*/RowDefinition/Grid.RowDefinitionsTextBlock Grid.Row0 VerticalAlignmentCenterComboBox:/TextBlockComboBox NamelstFast Grid.Row0 Grid.Column1 Margin5 ItemsSource{Binding PathDatas} VirtualizingStackPanel.ScrollUnitPixel VirtualizingStackPanel.VirtualizationModeRecycling VirtualizingStackPanel.CacheLength100ComboBox.ItemsPanelItemsPanelTemplateVirtualizingStackPanel/VirtualizingStackPanel/ItemsPanelTemplate/ComboBox.ItemsPanel/ComboBoxTextBlock Grid.Row1 VerticalAlignmentCenterListBox:/TextBlockListBox NamevirtualListBox Grid.Row1 Grid.Column1 Margin5 ItemsSource{Binding PathDatas} VirtualizingStackPanel.ScrollUnitPixel VirtualizingStackPanel.VirtualizationModeRecycling VirtualizingStackPanel.CacheLength100/TextBlock Grid.Row2 VerticalAlignmentCenterTreeView:/TextBlockTreeView NamevirtualTreeView Grid.Row2 Grid.Column1 Margin5 ItemsSource{Binding PathDatas} VirtualizingStackPanel.IsVirtualizingTrueVirtualizingStackPanel.ScrollUnitPixel VirtualizingStackPanel.VirtualizationModeRecycling VirtualizingStackPanel.CacheLength100 VirtualizingStackPanel.CacheLengthUnitItem//Grid
/WindowVirtualizationTest.xaml.cs
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/// /summarypublic partial class VirtualizationTest : Window{public VirtualizationTest(){InitializeComponent();DataContext this;}private void InitData(){for (int i 0; i 10000; i){Datas.Add(i.ToString());}}public ObservableCollectionstring Datas { get; set; } new ObservableCollectionstring();private void Window_Loaded(object sender, RoutedEventArgs e){InitData();}}
}