WPF使用WrapPanel實(shí)現(xiàn)虛擬化效果
WrapPanel 實(shí)現(xiàn)虛擬化
1.框架使用大于等于.NET40
;
2.Visual Studio 2022;
3.項(xiàng)目使用 MIT 開(kāi)源許可協(xié)議;
4.眾所周知 WPF 的 StackPanel 在加載大量數(shù)據(jù)時(shí)性能會(huì)特別差,但是官方提供了一個(gè)虛擬化容器VirtualizingStackPanel;
VirtualizingStackPanel.IsVirtualizing
附加屬性設(shè)置為true
時(shí)就開(kāi)啟虛擬化。VirtualizingStackPanel.IsVirtualizing
附加屬性設(shè)置為false
其VirtualizingStackPanel
行為與普通StackPanel
屬性的行為相同。
5.WrapPanel 默認(rèn)是不支持虛擬化的,所以需要自行實(shí)現(xiàn)。
1) VirtualizingWrapPanel 查看源碼 | VirtualizingWrapPanel 查看源碼。
2) 準(zhǔn)備數(shù)據(jù)HospitalList.cs如下:
using?System; using?System.Collections.Generic; using?System.Collections.ObjectModel; using?System.Windows.Media; namespace?WPFDevelopers.Minimal.Sample.Models { ????public?class?HospitalList?:?ObservableCollection<Hospital> ????{ ????????public?HospitalList() ????????{ ????????????var?hospitals?=?new?string[]?{?"No.?189,?Grove?St,?Los?Angeles",?"No.?3669,?Grove?St,?Los?Angeles"?}; ????????????var?names?=?new?string[]?{?"Doctor?Fang",?"Judge?Qu"?}; ????????????var?images?=?new?string[]? ????????????????{?"https://pic2.zhimg.com/80/v2-0711e97955adc9be9fbcff67e1007535_720w.jpg", ??????????????????//"https://pic2.zhimg.com/80/v2-5b7f84c63075ba9771f6e6dc29a54615_720w.jpg", ??????????????????"https://pic3.zhimg.com/80/v2-a3d6d8832090520e7ed6c748a8698e4e_720w.jpg", ??????????????????"https://pic3.zhimg.com/80/v2-de7554ac9667a59255fe002bb8753ab6_720w.jpg" ????????????????}; ????????????var?state?=?0; ????????????for?(var?i?=?1;?i?<?10000;?i++) ????????????{ ????????????????Add(new?Hospital?{?Id?=?$"9999{i}",?DoctorName?=?i?%?2?==?0???names[0]:names[1],?HospitalName?=?i?%?2?==?0???hospitals[0]?:?hospitals[1]?,State?=?state?,UserImage?=?images[state]?}); ????????????????state++; ????????????????if?(state?>?2) ????????????????????state?=?0; ????????????} ????????} ????} ????public?class?Hospital ????{ ????????public?string?Id?{?get;?set;?} ????????public?string?DoctorName?{?get;?set;?} ????????public?string?HospitalName?{?get;?set;?} ????????public?string?UserImage?{?get;?set;?} ????????public?int?State?{?get;?set;?} ????} }
3) 新建展示VirtualizingWrapPanelExample.xaml如下:
?<ws:Window?x:Class="WPFDevelopers.Minimal.Sample.ExampleViews.VirtualizingWrapPanelExample" ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008" ????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ????????xmlns:ws="https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal" ????????xmlns:local="clr-namespace:WPFDevelopers.Minimal.Sample.ExampleViews" ????????xmlns:model="clr-namespace:WPFDevelopers.Minimal.Sample.Models" ????????xmlns:converts="clr-namespace:WPFDevelopers.Minimal.Sample.Converts" ????????mc:Ignorable="d"?WindowStartupLocation="CenterScreen" ????????Title="System?V1.0"?Height="450"?Width="900"> ????<Window.Resources> ????????<model:HospitalList?x:Key="myHospitalList"/> ????????<converts:StateConvert??x:Key="stateConvert"></converts:StateConvert> ????</Window.Resources> ????<Grid?Margin="4"> ????????<WrapPanel?HorizontalAlignment="Left"> ????????????<WrapPanel.Resources> ????????????????<Style?TargetType="Border"> ????????????????????<Setter?Property="Padding"?Value="2"></Setter> ????????????????????<Setter?Property="BorderThickness"?Value="1"></Setter> ????????????????</Style> ????????????????<Style?TargetType="Rectangle"> ????????????????????<Setter?Property="Width"?Value="15"></Setter> ????????????????????<Setter?Property="Height"?Value="15"></Setter> ????????????????????<Setter?Property="Opacity"?Value=".2"></Setter> ????????????????</Style> ????????????</WrapPanel.Resources> ????????????<WrapPanel> ????????????????<Border?BorderBrush="Green"> ????????????????????<Rectangle?Fill="Green"/> ????????????????</Border> ????????????????<TextBlock?Text="Idle"?Foreground="Black"?Margin="4,0"/> ????????????</WrapPanel> ????????????<WrapPanel> ????????????????<Border?BorderBrush="Orange"> ????????????????????<Rectangle?Fill="Orange"/> ????????????????</Border> ????????????????<TextBlock?Text="Slightly?Idle"?Foreground="Black"?Margin="4,0"/> ????????????</WrapPanel> ????????????<WrapPanel> ????????????????<Border?BorderBrush="Red"> ????????????????????<Rectangle?Fill="Red"/> ????????????????</Border> ????????????????<TextBlock?Text="Busy"?Foreground="Black"?Margin="4,0"/> ????????????</WrapPanel> ????????</WrapPanel> ????????<TextBlock?HorizontalAlignment="Right"?Foreground="Black" ???????????????????Margin="4,2"?FontSize="16"> ????????????<Run?Text="Count:"></Run> ????????????<Run?Text="{Binding?ElementName=DocumentsList,Path=.Items.Count,Mode=OneTime}"></Run> ????????</TextBlock> ????????<ListBox?x:Name="DocumentsList" ??????ItemsSource="{Binding?Source={StaticResource?myHospitalList}}" ?????????????????????Margin="0,24,0,0"> ????????????<ListBox.ItemTemplate> ????????????????<DataTemplate> ????????????????????<Border?BorderBrush="{Binding?State,Converter={StaticResource?stateConvert}}"? ????????????????????????????BorderThickness="1" ????????????????????????????Width="196" ????????????????????????????Height="94"> ????????????????????????<Grid> ????????????????????????????<Grid.ColumnDefinitions> ????????????????????????????????<ColumnDefinition/> ????????????????????????????????<ColumnDefinition/> ????????????????????????????</Grid.ColumnDefinitions> ????????????????????????????<Grid.RowDefinitions> ????????????????????????????????<RowDefinition/> ????????????????????????????????<RowDefinition/> ????????????????????????????????<RowDefinition/> ????????????????????????????</Grid.RowDefinitions> ????????????????????????????<Rectangle? ????????????????????????????????Fill="{Binding?State,Converter={StaticResource?stateConvert}}"? ????????????????????????????????Opacity=".2"?Grid.ColumnSpan="2"? ????????????????????????????????Grid.RowSpan="3"/> ????????????????????????????<Border?Grid.RowSpan="2"?Grid.Column="0"?Width="60"?Height="60" ???????????????????????????????????????Margin="0,4,0,0"?CornerRadius="10"> ????????????????????????????????<Border.Background> ????????????????????????????????????<ImageBrush?ImageSource="{Binding?UserImage}"?Stretch="Uniform"/> ????????????????????????????????</Border.Background> ????????????????????????????</Border> ????????????????????????????<TextBlock?Grid.Column="1"?Grid.Row="0" ?????????????????????Text="{Binding?Path=Id}"?Margin="0,4,0,0"/> ????????????????????????????<TextBlock?Grid.Column="1"?Grid.Row="1" ?????????????????????Text="{Binding?Path=DoctorName}"/> ????????????????????????????<TextBlock?Grid.ColumnSpan="2"?Grid.Row="2" ???????????????????????????????????????Padding="10,0" ?????????????????????Text="{Binding?Path=HospitalName}"?TextTrimming="CharacterEllipsis"/> ????????????????????????</Grid> ????????????????????</Border> ????????????????</DataTemplate> ????????????</ListBox.ItemTemplate> ????????????<ListBox.Template> ????????????????<ControlTemplate> ????????????????????<Border?CornerRadius="2"? ???????????????????BorderBrush="{TemplateBinding?BorderBrush}" ???????????????????BorderThickness="{TemplateBinding?BorderThickness}"> ????????????????????????<ScrollViewer?x:Name="ScrollViewer" ??????????????????????????????????????Padding="{TemplateBinding?Padding}"? ??????????????????????????????????????Background="{TemplateBinding?Background}"? ??????????????????????????????????????BorderBrush="Transparent"?BorderThickness="0"??IsTabStop="False"> ????????????????????????????<ItemsPresenter?/> ????????????????????????</ScrollViewer> ????????????????????</Border> ????????????????</ControlTemplate> ????????????</ListBox.Template> ????????????<ListBox.ItemsPanel> ????????????????<ItemsPanelTemplate> ????????????????????<ws:VirtualizingWrapPanel?ItemWidth="200" ?????????????????????????????????????????????????ItemHeight="100"/> ????????????????</ItemsPanelTemplate> ????????????</ListBox.ItemsPanel> ????????</ListBox> ????</Grid> </ws:Window>
4) 狀態(tài)StateConvert.cs如下:
using?System; using?System.Windows.Data; using?System.Windows.Media; namespace?WPFDevelopers.Minimal.Sample.Converts { ????public?class?StateConvert?:?IValueConverter ????{ ????????public?object?Convert(object?value,?Type?targetType,?object?parameter,?System.Globalization.CultureInfo?cultureInfo) ????????{ ????????????var?color?=?Brushes.Green; ????????????if?(value?!=?null) ????????????{ ????????????????var?state?=?int.Parse(value.ToString()); ????????????????switch?(state) ????????????????{ ????????????????????case?0: ????????????????????????color?=?Brushes.Green; ????????????????????????break; ????????????????????case?1: ????????????????????????color?=?Brushes.Orange; ????????????????????????break; ????????????????????case?2: ????????????????????????color?=?Brushes.Red; ????????????????????????break; ????????????????} ????????????} ????????????return?color; ????????} ????????public?object?ConvertBack(object?value,?Type?targetType,?object?parameter,?System.Globalization.CultureInfo?cultureInfo) ????????{ ????????????throw?new?NotImplementedException(); ????????} ????} }
實(shí)現(xiàn)效果
到此這篇關(guān)于WPF使用WrapPanel實(shí)現(xiàn)虛擬化效果的文章就介紹到這了,更多相關(guān)WPF WrapPanel虛擬化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用QQ_Mail發(fā)送郵件實(shí)例代碼兩例
這篇文章介紹了C#調(diào)用QQ_Mail發(fā)送郵件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布
在消息隊(duì)列模型中,如何將消息廣播到所有的消費(fèi)者,這種模式成為“發(fā)布/訂閱”。本文主要以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述通過(guò)fanout交換機(jī),實(shí)現(xiàn)消息的發(fā)布與訂閱,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。2021-05-05C# dump系統(tǒng)lsass內(nèi)存和sam注冊(cè)表詳細(xì)
這篇文章主要介紹了C# dump系統(tǒng)lsass內(nèi)存和sam注冊(cè)表,在這里選擇 C# 的好處是體積小,結(jié)合 loadAssembly 方便免殺,希望對(duì)讀者們有所幫助2021-09-09分享WCF文件傳輸實(shí)現(xiàn)方法---WCFFileTransfer
這篇文章主要介紹了分享WCF文件傳輸實(shí)現(xiàn)方法---WCFFileTransfer,需要的朋友可以參考下2015-11-11