WPF中ListBox ListView数据翻页浏览笔记(强调:是数据翻页,非翻页动画)

ListBox和ListView在应用中,常常有需求关于每页显示固定数量的数据,然后通过Timer自动或者手动翻页操作,本文介绍到的就是该动作的实现。

一.重点

  对于ListBox和ListView来讲,后台绑定的ItemSource绑定的一般都是List<T>格式,而List<T>有个方法是Take和Skip,分别意思是取List部分和跳过List部分。

取数据的格式是:List.take().Skip();

二.话不多说,实例说话(后面会附有该例子链接,仅供参考)

(1)Xaml界面上:

<StackPanel>
        <ListBox Height="300"  ScrollViewer.VerticalScrollBarVisibility="Disabled" ItemsSource="{Binding ListShow}"></ListBox>
        <Button x:Name="TurnUpButton" Content="上翻页" Click="TurnPageUp"   Height="50" />
        <Button x:Name="TurnDownButton" Content="下翻页" Click="TurnPageDown" Height="50"/>
        <Button Content="自动翻页" Click="Button_Click_1" Height="50"/>
    </StackPanel>

ListBox是数据显示区域,三个Button的Content已写明各自功能。

(2)CS代码

 public partial class MainWindow : Window
    {

        public ObservableCollection<string> ListShow
        {
            get { return (ObservableCollection<string>)GetValue(ListShowProperty); }
            set { SetValue(ListShowProperty, value); }
        }

        public List<string> NameList = new List<string>();

        public MainWindow()
        {
            InitializeComponent();
            //WPF数据绑定
            this.DataContext = this;
            //假数据创建
            Data();
            //数据显示
            ContentShow();
            //Timer初始化 为自动翻页做准备
            TimeSet();

        }

        private void Data()
        {
            for (int i = 0; i < 30; i++)
            {
                string s = "Name" + i.ToString();
                NameList.Add(s);
            }
        }

        private void ContentShow()
        {
            ListShow = new ObservableCollection<string>(NameList.Take(PageSize * Page).Skip(PageSize * (Page - 1)));
            if (NameList.Count % PageSize == 0)
            {
                Total = NameList.Count / PageSize;
            }
            else
            {
                Total = NameList.Count / PageSize + 1;
            }
            TurnUpButton.Visibility = Page > 1 ? Visibility.Visible : Visibility.Hidden;
            TurnDownButton.Visibility = Page < Total ? Visibility.Visible : Visibility.Hidden;
        }

        private void TimeSet()
        {
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(5);
            timer.Tick += timer_Tick;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            if (Page < Total)
            {
                Page++;
                ContentShow();
            }
            else
            {
                Page = 1;
                ContentShow();
            }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (IsOpen == true)
            {
                IsOpen = false;
                timer.Stop();
            }
            else
            {
                timer.Start();
                IsOpen = true;
            }
        }

        private void TurnPageUp(object sender, RoutedEventArgs e)
        {
            Page--;
            ContentShow();
        }

        private void TurnPageDown(object sender, RoutedEventArgs e)
        {
            Page++;
            ContentShow();
        }
        DispatcherTimer timer;
        private bool IsOpen;
        private int Page = 1;
        private int Total;
        private int PageSize = 7;

        public static readonly DependencyProperty ListShowProperty =
            DependencyProperty.Register("ListShow", typeof(ObservableCollection<string>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<string>()));

    }

  ListShow是Xaml的ListBox的ItemSource绑定对象,所有数据都是通过ListShow显示到界面上的。

  强调一定要用ObservableCollection<T>类型,这样才能在ListShow数据发生改变后,界面自动刷新,普通List<T>赋值上去是不会刷新界面的。

  Page--当前页数。PageSize--每页数据数量。Total--总页数。

            ListShow = new ObservableCollection<string>(NameList.Take(PageSize * Page).Skip(PageSize * (Page - 1)));

  Take取PageSize*Page条数据,Skip跳过(PageSize*(Page-1))条数据,实际获取的就是1页的数据,即1个PageSize。

  下面两条代码是为了限制在Page在首页和尾页时,不能继续向前翻和后翻,而设置的可见不可见。

  TurnUpButton.Visibility = Page > 1 ? Visibility.Visible : Visibility.Hidden;
            TurnDownButton.Visibility = Page < Total ? Visibility.Visible : Visibility.Hidden;

三.易错点

(1)timer一定要用DispatcherTimer,如果只是用Timer会因为线程问题而不能实现自动翻页。

(2)依赖属性的Register中最后面的New PropertyMedata中是new出来一个空的ObservableCollection<string>(),不是String.Empty或者Null

四.代码下载

  

时间: 2024-10-13 22:24:39

WPF中ListBox ListView数据翻页浏览笔记(强调:是数据翻页,非翻页动画)的相关文章

WPF中Listbox/ListView 横向展示/滑动内容的方法

<ListView Name="BoardListView" ScrollViewer.VerticalScrollBarVisibility="Hidden" Height="100" VerticalAlignment="Bottom"> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel/> </ItemsPan

WPF ItemsControl ListBox ListView比较

在进行列表信息展示时,WPF中提供多种列表可供选择.这篇博客将对WPF ItemsControl, ListBox, ListView进行比较. 相同点: 1. 这三个控件都是列表型控件,可以进行列表绑定(ItemsSource): 2. 这三个控件均使用ItemsPresenter来展示列表信息: 不同点: 控件层次关系: ItemsControl: System.Object  System.Windows.Threading.DispatcherObject System.Windows.

WPF中ListBox滚动时的缓动效果

原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时可以很流畅. 修改模板里的动画效果是一种方法,不过这里有更简单的,WPF为我们提供了行为代码,可以编辑在ListBox的ItemsPanelTemplate模板中,实现方法如下: 右键ListBox选择"编辑其它模板"->"辑项的布局"->"编辑副

转:WPF中ListBox的创建和多种绑定用法

先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox Margin="10,10,0,13" Name="listBox1" HorizontalAlignment="Left"         VerticalAlignment="Top" Width="194"

WPF中为ListView动态绑定数据(可参考)

GridView gv = new GridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(int i=0;i<dt.Rows.Count;i++) {     if(i==0)     {         GridViewColumn gvc=new GridViewColumn();         CheckBox cb = new CheckBox();         cb.Checked +=

如何让 WPF 中 ListBox 列表项前自动加上序号

有时候我们可以希望在 ListBox 列表项前面加上序号,这样看起来更清楚,还可以配合使用快捷键等. 希望达到如下图的效果: 显然我们可以通过修改 ListBox 的模板来实现,只要在 Item 中加上数字这一项即可,利用 MultiBinding 和 IMultiValueConverter 即可实现. 示例 首先,我们创建一个 Person 类: public class Person { public string Name { get; set; } } 然后创建一个 Converter

WPF中ListBox的样式设置

设置之后的效果为 1 窗体中代码 <Window x:Class="QyNodeTest.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="MainWindow&

在WPF中让ListBox和ComboBox的快速检索功能失效

问题来源: 自定义一个ComboBox,用来显示日期.后台数据使用的是DateTime,经过Converter转化成“2015年01月01日”样子的成字符串用于显示. 但是,在实际使用中,不停的按下“[”键,光标会从以一个元素一下一下的向下移动. 经过调查,这是ComboBox的“快速检索”功能在作祟. 关于快速检索: WPF中ListBox和ComboBox有一个“快速检索”的功能. 比如在ListBox里,按下“a”键,光标会定位到第一个首字母为“a”的Item上. ComboBox也是一样

【转】WPF中实现自定义虚拟容器(实现VirtualizingPanel)

在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题.有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容器中的可见元素个数是有限的,剩余大多数元素都处于不可见状态,如果一次性将所有的数据元素都渲染出来则会非常的消耗性能.因而可以考虑只渲染当前可视区域内的元素,当可视区域内的元素需要发生改变时,再渲染即将展现的元素,最后将不再需要展现的元素清除掉,这样可以大大提高性能.在WPF中System.Windows.Controls命名空间下的VirtualizingStackP