ListView 虚模式和绑定数组数据
1:WPF里面 默认是采用了虚模式的,一般情况下,不使用虚模式占的物理内存比使用虚模式多一倍,但是在界面上进行拖动的时候,流畅一些,
使用虚模式将会使用虚拟内存,占用内存较少,但是问题在有时候动态刷新数据的时候,是会卡界面的。
View Code
VirtualizingStackPanel.IsVirtualizing="True"
设置是否使用虚模式,默认是true
2:在使用listview显示大数据量是,动态添加列数据,超过200列一般会比较卡
绑定方式
申明数据集合
List<string[]> listDataArray = new List<string[]>();
完成初始化listDataArray
动态添加列并绑定数据源
for (int i = 0; i < count; i++)
{
GridViewColumn gridViewColumn = new GridViewColumn();
gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]");
myGridView.Columns.Add(gridViewColumn);
}
数据后绑定数据源
myListView.ItemsSource = listDataArray;
gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]");
完整源码
前台
<Window x:Class="WpfApplication1.MainWindowT2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uc="clr-namespace:WpfApplication1" Title="MainWindowT2" Height="350" Width="525"> <Window.Resources> <uc:IndexConverter x:Key="indexConverter" /> <!-- 复选框 --> <DataTemplate x:Key="TheCheckBox"> <TextBlock VerticalAlignment="Center"> <CheckBox Name="ckb_SelectAll" Click="ckb_SelectAll_Click" Margin="6 0 0 0"> <TextBlock Foreground="White">全选</TextBlock> </CheckBox> </TextBlock> </DataTemplate> <uc:ListViewItemStyleSelector x:Key="myStyleSelector"/> <Style x:Key="st" TargetType="GridViewColumnHeader"> <Style.Setters> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="White" Offset="0.2"/> <GradientStop Color="LightGray" Offset="0.5"/> <GradientStop Color="Gray" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> </Style.Setters> </Style> </Window.Resources> <Grid> <ListView Name="myListView" ItemContainerStyleSelector="{DynamicResource myStyleSelector}" VirtualizingStackPanel.VirtualizationMode="Recycling" ScrollViewer.VerticalScrollBarVisibility="Visible" > <ListView.View> <GridView x:Name="myGridView" ColumnHeaderContainerStyle="{StaticResource st}" > <!--<GridViewColumn Header="序号" DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}} , Converter={StaticResource indexConverter}}" />--> </GridView> </ListView.View> </ListView> <Button Height="30" Name="Btnleft" Visibility="Hidden" Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0,0,0,50" Background="Transparent" Content="Left" Click="Button_Click" /> <Button Height="30" Name="BtnRight" Visibility="Hidden" Width="100" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,0,50" Background="Transparent" Content="Right" Click="Button_Click_1" /> </Grid> </Window>
后台
View Code
using System; using System.Collections.Generic; 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.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindowT2 : Window { public MainWindowT2() { InitializeComponent(); string[] header = new string[2050]; for (int j = 0; j < 2050; j++) { header[j] = j + "name"; } initDatas(header);//初始化列数 ShowListView(); } private void AddCheckBox() { GridViewColumn gvc = new GridViewColumn(); CheckBox cb = new CheckBox(); cb.Checked += new RoutedEventHandler(cb_Checked); cb.Content = new TextBlock().Text = "全选"; gvc.Header = cb; gvc.Width = 100; gvc.CellTemplate = (DataTemplate)Resources["TheCheckBox"]; myGridView.Columns.Add(gvc); } void cb_Checked(object sender, RoutedEventArgs e) { //throw new NotImplementedException(); } int CountClos = 100; List<List<string>> listDataArray = new List<List<string>>(); private void ShowListView() { List<string> header; for (int i = 0; i < 10000; i++) { header = new List<string>(); for (int j = 0; j < 2050; j++) { header.Add(j + "name"); } listDataArray.Add(header); } myListView.ItemsSource = listDataArray; } void myListView_MouseWheel(object sender, MouseWheelEventArgs e) { Console.WriteLine("dddd"); } void btn_Click(object sender, RoutedEventArgs e) { //VirtualizingStackPanel.IsVirtualizing="False" string txt = string.Empty; Clipboard.SetText(txt); MessageBox.Show(txt); } private void myListView_ScrollChanged(object sender, ScrollChangedEventArgs e) { } private void ckb_SelectAll_Click(object sender, RoutedEventArgs e) { } int length = 0;//总共长度 public void initDatas(object[] cols) { length = cols.Length; index = 0; if (cols.Length > CountClos) { BtnRight.Visibility = Visibility.Visible; } int count = cols.Count() > CountClos ? CountClos : cols.Count(); for (int i = 0; i < count; i++) { GridViewColumn gridViewColumn = new GridViewColumn(); gridViewColumn.DisplayMemberBinding = new Binding("[" + i + "]"); myGridView.Columns.Add(gridViewColumn); } } int index = 0;//0页 /// <summary> /// Left /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { if (index != 0) { index--;//左移一页 for (int i = 0; i < myGridView.Columns.Count; i++) { myGridView.Columns[i].DisplayMemberBinding = new Binding("[" + (index * CountClos + i) + "]"); } if (index == 0) { Btnleft.Visibility = Visibility.Hidden; } BtnRight.Visibility = Visibility.Visible; } } /// <summary> /// right /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click_1(object sender, RoutedEventArgs e) { int totle = length / CountClos; if (length % CountClos != 0) { totle++; } if (index < totle) { index++;//右移一页 for (int i = 0; i < myGridView.Columns.Count; i++) { myGridView.Columns[i].DisplayMemberBinding = new Binding("[" + (index * CountClos + i) + "]"); } } if (index+1 == totle) { BtnRight.Visibility = Visibility.Hidden; } Btnleft.Visibility = Visibility.Visible; } } }
间隔行变色
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows; using System.Windows.Media; using System.Windows.Data; namespace WpfApplication1 { public class ListViewItemStyleSelector : StyleSelector { public override Style SelectStyle(object item, DependencyObject container) { Style st = new Style(); st.TargetType = typeof(ListViewItem); Setter backGroundSetter = new Setter(); backGroundSetter.Property = ListViewItem.BackgroundProperty; ListView listView = ItemsControl.ItemsControlFromItemContainer(container) as ListView; int index = listView.ItemContainerGenerator.IndexFromContainer(container); if (index % 2 == 0) { backGroundSetter.Value = Brushes.LightBlue; } else { backGroundSetter.Value = Brushes.Beige; } st.Setters.Add(backGroundSetter); return st; } } public class IndexConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { ListViewItem item = value as ListViewItem; ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView; int index = listView.ItemContainerGenerator.IndexFromContainer(item); return index.ToString(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } }

浙公网安备 33010602011771号