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

    四.代码下载

      

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/Khan-Sadas/p/4931018.html
Copyright © 2011-2022 走看看