WPF分页控件

最近要写个程序要用到分页控件,找到了很多好高级的,代码拿到了也看不懂。最后找到了一个能看懂的,完善了一下。

源控件https://www.cnblogs.com/madehua/archive/2011/12/14/2287672.html 

 

页面代码

WPF分页控件
<UserControl x:Class="WpfCustomControlLibrary.PagerControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfCustomControlLibrary"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid x:Name="MainGrid">
        <Grid.Resources>
            <Style x:Key="ButtonStyleOne" TargetType="Button">
                <Setter Property="Margin" Value="5"/>
                <Setter Property="Background" Value="CadetBlue"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="Width" Value="55"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="True">
                        <Setter Property="Background" Value="CadetBlue"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </Style.Triggers>
               
            </Style>

            <Style x:Key="ButtonTwo" TargetType="Button">
                <Setter Property="BorderBrush" Value="{x:Null}"/>
                <Setter Property="Background" Value="White"/>
                <Setter Property="Width" Value="30"/>
                <Setter Property="Height" Value="20"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Azure"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
            
        </Grid.Resources>
        <StackPanel Orientation="Horizontal" Background="White">

            <Button Name="FirstButton" Content="首页" Style="{StaticResource  ButtonStyleOne}" Click="FirstButton_Click" />
           

            <Button Name="PreButton" Content="上一页" Style="{StaticResource  ButtonStyleOne}" Click="PreButton_Click" />
            <StackPanel x:Name="ButtonPages" Orientation="Horizontal" Background="White">
              
            </StackPanel>
           

            <Button Name="NextButton" Content="下一页" Style="{StaticResource  ButtonStyleOne}" Click="NextButton_Click" />
            <Button Name="LastButton" Content="尾页" Style="{StaticResource  ButtonStyleOne}" Click="LastButton_Click" />

            <TextBlock VerticalAlignment="Center" FontSize="12" > 
                <TextBlock Text="【共"/>
                <TextBlock Name="txtCount" Text="" Foreground="Red"/>
                <TextBlock Text="页】"/> 
                <TextBlock Text="【当前第"/>
                <TextBlock Name="txtCurrent" Foreground="Red"/>
                <TextBlock Text="页】"/>
                 <TextBlock Text="【共"/>
                <TextBlock Name="txtAll" Foreground="Red"/>
                <TextBlock Text="条记录】"/>
            </TextBlock>

        </StackPanel>
    </Grid>
</UserControl>
View Code

后台代码

WPF分页控件
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

using System.Windows.Media;

namespace WpfCustomControlLibrary
{
    //public delegate void PagerIndexChangingEvent(int pageIndex, EventArgs e);

    /// <summary>
    /// PagerControl.xaml 的交互逻辑
    /// </summary>
    public partial class PagerControl : UserControl
    {
        public PagerControl()
        {
            InitializeComponent();
        }
        //public event PagerIndexChangingEvent PageIndexChanging;

        /// <summary>
        /// 当前页索引
        /// </summary>
        private int pageIndex = 0;

        public int PageIndex
        {
            get { return pageIndex; }
            set { pageIndex = value; }
        }
        /// <summary>
        /// 总页数
        /// </summary>
        private int pageCount;
        /// <summary>
        /// 一页个数
        /// </summary>
        private int pageSize = 12;

        public int PageSize
        {
            get { return pageSize; }
            set { pageSize = value; }
        }

        public IList Logs { get; set; }//数据源
        public DataGrid dg { get; set; }//装载数据的DateGrid

        //数据个数

        private int count;
   
        public int Count
        {
            get { return count; }
            set
            {
                count = value;
                if (count == 0)
                    pageCount = 0;// ButtonPages.Children.Count+ 
                else
                    pageCount =  count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
                txtCount.Text = pageCount.ToString();
                txtAll.Text = count.ToString();

             
                if (pageCount<=5&& pageCount> ButtonPages.Children.Count)
                {

                    Button button = new Button();
                    Style myStyle = (Style)MainGrid.FindResource("ButtonTwo");//TabItemStyle 这个样式是引用的资源文件中的样式名称
                    button.Style = myStyle;
                    button.Click += ButtonTwo_Click;

                    button.Content = (ButtonPages.Children.Count + 1).ToString();
                    if (ButtonPages.Children.Count == 0) button.Background = Brushes.LightBlue;
                    ButtonPages.Children.Add(button);
                }
               
               
                Init(null);
            }
        }

        public void Init(EventArgs e)
        {
            try
            {
                InitButton();
                int temp = pageIndex + 1;
                if (pageCount == 0)
                    txtCurrent.Text = "0";
                else
                    txtCurrent.Text = temp.ToString();
                if (e != null)
                {
                    //PageIndexChanging(pageIndex, e);
                    ChangeGridPage(Logs,dg);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

     public   void InitButton()
        {
            this.FirstButton.IsEnabled = true;
            this.PreButton.IsEnabled = true;
            this.NextButton.IsEnabled = true;
            this.LastButton.IsEnabled = true;
            //this.FirstButton.Background = Brushes.CadetBlue;
            //this.PreButton.Background = Brushes.CadetBlue;
            //this.NextButton.Background = Brushes.CadetBlue;
            //this.LastButton.Background = Brushes.CadetBlue;

            //总共一页
            if (pageCount < 2)
            {
                //this.FirstButton.Background = Brushes.Red;
                //this.PreButton.Background = Brushes.Red;
                //this.NextButton.Background = Brushes.Red;
                //this.LastButton.Background = Brushes.Red;
                this.FirstButton.IsEnabled = false;
                this.PreButton.IsEnabled = false;
                this.NextButton.IsEnabled = false;
                this.LastButton.IsEnabled = false;

                return;
            }

            //第一页
            if (pageIndex == 0)
            {
                //this.FirstButton.Background = Brushes.Ivory;
                //this.PreButton.Background = Brushes.Ivory;
                this.FirstButton.IsEnabled = false;
                this.PreButton.IsEnabled = false;

                return;
            }

            //最后一页
            if (pageIndex + 1 == pageCount)
            {
                //this.NextButton.Background = Brushes.Ivory;
                //this.LastButton.Background = Brushes.Ivory;
                this.NextButton.IsEnabled = false;
                this.LastButton.IsEnabled = false;

            }
        }

       
        /// <summary>
        /// 首页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FirstButton_Click(object sender, RoutedEventArgs e)
        {
            if (count == 0) return;
            pageIndex = 0;
            for (int i = 0; i < 5; i++)
            {
                (ButtonPages.Children[i] as Button).Background = Brushes.White;
                (ButtonPages.Children[i] as Button).Content = i + 1;
                if (i == pageIndex)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                }

            }
            Init(e);
        }

        /// <summary>
        /// 上一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PreButton_Click(object sender, RoutedEventArgs e)
        {
            if (pageIndex == 0) return;
            --pageIndex;
            AddAndRemove(pageIndex, sender,e);
            Init(e);
        }

        /// <summary>
        /// 下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void NextButton_Click(object sender, RoutedEventArgs e)
        {
            if (pageIndex >=count) return;
            ++pageIndex;
            AddAndRemove(pageIndex, sender, e);
            Init(e);
        }

        /// <summary>
        /// 尾页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LastButton_Click(object sender, RoutedEventArgs e)
        {
            if (count <= 0) return;
            pageIndex = pageCount - 1;
            for (int i = 0; i < 5; i++)
            {
                (ButtonPages.Children[i] as Button).Background = Brushes.White;
                (ButtonPages.Children[i] as Button).Content = pageCount - 5 + i + 1;
                if (pageCount - 5 + i == pageIndex)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                }

            }
            Init(e);
        }

        private void Button_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (!(sender as Button).IsEnabled)
            {
                (sender as Button).Background = Brushes.Red;
            }
            else
            {
                (sender as Button).Background = Brushes.CadetBlue;
            }

        }
        private void ButtonTwo_Click(object sender ,RoutedEventArgs e)
        {


            pageIndex = int.Parse((sender as Button).Content.ToString())-1;

            if ((pageCount <= 5 || pageIndex <= 2 || pageIndex >= pageCount - 3) && (int.Parse((ButtonPages.Children[0] as Button).Content.ToString()) == 1 || int.Parse((ButtonPages.Children[4] as Button).Content.ToString()) == pageCount))
            {
                for (int i = 0; i < ButtonPages.Children.Count; i++)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.White;
                    if ((ButtonPages.Children[i] as Button).Content.ToString() == (pageIndex + 1).ToString())
                    {
                        (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                    }

                }


            }
            else
            {
                int Firstindex = pageIndex - 2;
                if (Firstindex + 5 > pageCount)
                {
                    Firstindex = pageCount - 5;


                }
                for (int i = 0; i < 5;)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.White;
                    if (Firstindex + 1 <= 0)
                    {
                        Firstindex++;
                        continue;
                    }
                    

                    (ButtonPages.Children[i] as Button).Content = Firstindex + 1;
                    if (Firstindex == pageIndex)
                    {
                        (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                    }
                    Firstindex++;
                    i++;
                }
            }

            Init(e);

        }

        private void AddAndRemove(int Index,object sender,  RoutedEventArgs e)
        {
            pageIndex = Index;

            if ((pageCount <= 5 || pageIndex <= 2 || pageIndex >= pageCount - 3)&& (int.Parse((ButtonPages.Children[0] as Button).Content.ToString()) == 1 || int.Parse((ButtonPages.Children[4] as Button).Content.ToString()) == pageCount))
            {
                for (int i = 0; i < ButtonPages.Children.Count; i++)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.White;
                    if ((ButtonPages.Children[i] as Button).Content.ToString() == (pageIndex + 1).ToString())
                    {
                        (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                    }

                }


            }
            else
            {
                int Firstindex = pageIndex - 2;
                for (int i = 0; i < 5; i++)
                {
                    (ButtonPages.Children[i] as Button).Background = Brushes.White;
                    (ButtonPages.Children[i] as Button).Content = Firstindex + 1;
                    if (Firstindex == pageIndex)
                    {
                        (ButtonPages.Children[i] as Button).Background = Brushes.LightBlue;
                    }
                    Firstindex++;
                }
            }

            Init(e);
        }

       
        private void ChangeGridPage(IList AllLog,DataGrid datagrid)
        {
          
            Count = AllLog.Count;//设置总数据量
            datagrid.Items.Clear();//清空当前数据

            int number =PageSize;
            if (AllLog.Count - PageSize * pageIndex < PageSize)
            {
                //获取当前页数据量,最后一页数据量不满
                number = AllLog.Count - PageSize * pageIndex;
            }

            for (int i = PageSize * pageIndex; i < PageSize * pageIndex+number; i++)
            {
                datagrid.Items.Add(AllLog[i]);//添加数据
            }


            //foreach (var item in AllLog.GetRange(PageSize * pageIndex, number))
            //{
            //    datagrid.Items.Add(item);//添加数据
            //}
        }

       


    }
}
View Code

调用页面代码

 xmlns:MyNamespace="clr-namespace:WpfCustomControlLibrary;assembly=WpfCustomControlLibrary"
 //先引用自定义控件项目

  <MyNamespace:PagerControl HorizontalAlignment="Right" x:Name="pager" Grid.Row="3">
            
        </MyNamespace:PagerControl>   

调用页面后台代码

public MainForm()
        {
           
            InitializeComponent();
           
            pager.PageSize = 30;//设置每页数据量
            pager.Logs = AllLog;//设置数据源IList格式,DataTable尝试传DataTable.Rows,不行就把控件后台代码重写了吧
            pager.dg = datagrid;//装载数据的DataGrid控件
           

        }

 

有些问题没有处理,不知为何控件IsEnable属性设置为空时,无法改变按钮的颜色。

跳转没做,因为我的项目总共的数据量也不大,需要的自己加上,只要把Index传给 AddAndRemove(int Index,object sender,  RoutedEventArgs e) 这个方法就好了,

因为这个方法我是嵌在事件里用的,实际只传Index就可以,其余两个属性照搬事件的属性就好。

 

WPF分页控件

上一篇:P2657 [SCOI2009] windy 数


下一篇:HTTP methods 与 RESTful API