zoukankan      html  css  js  c++  java
  • 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

    四.代码下载

      

  • 相关阅读:
    Remote Debugging (2)
    Remote Debugging (3)
    在面试中常见额智力测试
    异常处理和约束
    方法&函数区别,反射
    类与类之间的关系
    成员
    初识面向对象
    一些令你""呵呵''的题目
    内置函数二 & 递归 & 二分查找
  • 原文地址:https://www.cnblogs.com/Khan-Sadas/p/4931018.html
Copyright © 2011-2022 走看看