266 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
using NetTaste;
 | 
						|
using Prism.Commands;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Linq;
 | 
						|
using System.Reflection;
 | 
						|
using System.Text;
 | 
						|
using System.Threading.Tasks;
 | 
						|
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 DM_Weight.Components.pagination
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Pagination.xaml 的交互逻辑
 | 
						|
    /// </summary>
 | 
						|
    public partial class Pagination : UserControl
 | 
						|
    {
 | 
						|
        public Pagination()
 | 
						|
        {
 | 
						|
            InitializeComponent();
 | 
						|
            ResetInfoText();
 | 
						|
            ResetCurrentPageText();
 | 
						|
        }
 | 
						|
 | 
						|
        static Pagination()
 | 
						|
        {
 | 
						|
            InitializeCommands();
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        private static readonly Type _typeofSelf = typeof(Pagination);
 | 
						|
 | 
						|
 | 
						|
        private static void InitializeCommands()
 | 
						|
        {
 | 
						|
            FirstCommand = new RoutedCommand("First", _typeofSelf);
 | 
						|
            PrevCommand = new RoutedCommand("Prev", _typeofSelf);
 | 
						|
            NextCommand = new RoutedCommand("Next", _typeofSelf);
 | 
						|
            EndCommand = new RoutedCommand("End", _typeofSelf);
 | 
						|
 | 
						|
 | 
						|
            CommandManager.RegisterClassCommandBinding(_typeofSelf,
 | 
						|
                new CommandBinding(FirstCommand, OnFirstComman, OnCanFirstComman));
 | 
						|
            CommandManager.RegisterClassCommandBinding(_typeofSelf,
 | 
						|
                new CommandBinding(PrevCommand, OnPrevCommand, OnCanPrevCommand));
 | 
						|
            CommandManager.RegisterClassCommandBinding(_typeofSelf,
 | 
						|
                new CommandBinding(NextCommand, OnNextCommand, OnCanNextCommand));
 | 
						|
            CommandManager.RegisterClassCommandBinding(_typeofSelf,
 | 
						|
                new CommandBinding(EndCommand, OnEndCommand, OnCanEndCommand));
 | 
						|
        }
 | 
						|
 | 
						|
        
 | 
						|
 | 
						|
        public static RoutedCommand FirstCommand { get; private set; }
 | 
						|
        private static void OnFirstComman(object sender, RoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            ctrl.CurrentPage = 1;
 | 
						|
        }
 | 
						|
 | 
						|
        private static void OnCanFirstComman(object sender, CanExecuteRoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            e.CanExecute = ctrl.CurrentPage > 1;
 | 
						|
        }
 | 
						|
 | 
						|
        public static RoutedCommand PrevCommand { get; private set; }
 | 
						|
        private static void OnPrevCommand(object sender, RoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            ctrl.CurrentPage--;
 | 
						|
        }
 | 
						|
 | 
						|
        private static void OnCanPrevCommand(object sender, CanExecuteRoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            e.CanExecute = ctrl.CurrentPage > 1;
 | 
						|
        }
 | 
						|
 | 
						|
        public static RoutedCommand NextCommand { get; private set; }
 | 
						|
 | 
						|
        private static void OnNextCommand(object sender, RoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            ctrl.CurrentPage++;
 | 
						|
        }
 | 
						|
 | 
						|
        private static void OnCanNextCommand(object sender, CanExecuteRoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            e.CanExecute = ctrl.CurrentPage < ctrl.PageCount;
 | 
						|
        }
 | 
						|
        public static RoutedCommand EndCommand { get; private set; }
 | 
						|
        private static void OnEndCommand(object sender, RoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            ctrl.CurrentPage = ctrl.PageCount;
 | 
						|
        }
 | 
						|
 | 
						|
        private static void OnCanEndCommand(object sender, CanExecuteRoutedEventArgs e)
 | 
						|
        {
 | 
						|
            var ctrl = sender as Pagination;
 | 
						|
            e.CanExecute = ctrl.CurrentPage < ctrl.PageCount;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        // 默认当前页码
 | 
						|
        public static int DefaultCurrentPage = 1;
 | 
						|
        // 默认总条数
 | 
						|
        public static int DefaultTotalPages = 0;
 | 
						|
        // 默认每页条数列表
 | 
						|
        public static List<int> DefaultPageSizeList = new List<int> { 10, 20, 50, 100 };
 | 
						|
        // 是否显示页码条数信息
 | 
						|
        public static bool DefaultInfoTextIsEnabel = true;
 | 
						|
        // 默认每页条数
 | 
						|
        public static int DefaultPageSize = 10;
 | 
						|
 | 
						|
 | 
						|
        public static readonly DependencyProperty CurrentPageProperty = DependencyProperty
 | 
						|
                .Register("CurrentPage",
 | 
						|
                typeof(int),
 | 
						|
                typeof(Pagination),
 | 
						|
                new FrameworkPropertyMetadata(DefaultCurrentPage, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
 | 
						|
        public static readonly DependencyProperty PageSizeProperty = DependencyProperty
 | 
						|
                .Register("PageSize",
 | 
						|
                typeof(int),
 | 
						|
                typeof(Pagination),
 | 
						|
                new FrameworkPropertyMetadata(DefaultPageSize, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
 | 
						|
        public static readonly DependencyProperty TotalPagesProperty = DependencyProperty
 | 
						|
                .Register("TotalPages",
 | 
						|
                typeof(int),
 | 
						|
                typeof(Pagination),
 | 
						|
                new FrameworkPropertyMetadata(DefaultTotalPages, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnItemsSourceChanged)));
 | 
						|
        public static readonly DependencyProperty InfoTextIsEnabelProperty = DependencyProperty
 | 
						|
                .Register("InfoTextIsEnabel",
 | 
						|
                typeof(bool),
 | 
						|
                typeof(Pagination),
 | 
						|
                new FrameworkPropertyMetadata(DefaultInfoTextIsEnabel, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
 | 
						|
        private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            Pagination p = (Pagination)d;
 | 
						|
 | 
						|
            p.ResetInfoText();
 | 
						|
        }
 | 
						|
 | 
						|
        [Bindable(true)]
 | 
						|
        [Category("Appearance")]
 | 
						|
        public int CurrentPage
 | 
						|
        {
 | 
						|
            get { return (int)GetValue(CurrentPageProperty); }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                SetValue(CurrentPageProperty, value);
 | 
						|
                if (InfoTextIsEnabel)
 | 
						|
                {
 | 
						|
                    ResetInfoText();
 | 
						|
                }
 | 
						|
                ResetCurrentPageText();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        //private static void OnCurrentPageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
 | 
						|
        //{
 | 
						|
        //    Pagination p = d as Pagination;
 | 
						|
 | 
						|
        //    if (p != null)
 | 
						|
        //    {
 | 
						|
        //        Console.WriteLine(e.NewValue);
 | 
						|
        //    }
 | 
						|
        //}
 | 
						|
 | 
						|
        [Bindable(true)]
 | 
						|
        [Category("Appearance")]
 | 
						|
        public int PageSize
 | 
						|
        {
 | 
						|
            get { return (int)GetValue(PageSizeProperty); }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                SetValue(PageSizeProperty, value);
 | 
						|
                if (InfoTextIsEnabel)
 | 
						|
                {
 | 
						|
                    ResetInfoText();
 | 
						|
                }
 | 
						|
                ResetCurrentPageText();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        [Bindable(true)]
 | 
						|
        [Category("Appearance")]
 | 
						|
        public int TotalPages
 | 
						|
        {
 | 
						|
            get { return (int)GetValue(TotalPagesProperty); }
 | 
						|
            set
 | 
						|
            { 
 | 
						|
                SetValue(TotalPagesProperty, value);
 | 
						|
                if (InfoTextIsEnabel)
 | 
						|
                {
 | 
						|
                    ResetInfoText();
 | 
						|
                }
 | 
						|
                ResetCurrentPageText();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public bool InfoTextIsEnabel
 | 
						|
        {
 | 
						|
            get { return (bool)GetValue(InfoTextIsEnabelProperty); }
 | 
						|
            set { SetValue(InfoTextIsEnabelProperty, value); }
 | 
						|
        }
 | 
						|
 | 
						|
        public int PageCount
 | 
						|
        {
 | 
						|
            get => (int)Math.Ceiling((double)TotalPages / PageSize);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        public void ResetInfoText()
 | 
						|
        {
 | 
						|
            this.Dispatcher.BeginInvoke(() =>
 | 
						|
            {
 | 
						|
                if (InfoTextIsEnabel)
 | 
						|
                {
 | 
						|
                    if (TotalPages <= PageSize)
 | 
						|
                    {
 | 
						|
                        this.InfoBlock.Text = $"1-{TotalPages}/{TotalPages}";
 | 
						|
                        if (TotalPages == 0)
 | 
						|
                        {
 | 
						|
                            this.InfoBlock.Text = $"0-{TotalPages}/{TotalPages}";
 | 
						|
                        }
 | 
						|
                    } else
 | 
						|
                    {
 | 
						|
                        this.InfoBlock.Text = ((CurrentPage - 1) * PageSize + 1) + "-" + (CurrentPage * PageSize > TotalPages ? TotalPages : CurrentPage * PageSize) + "/" + TotalPages;
 | 
						|
                    }
 | 
						|
                    
 | 
						|
                } else
 | 
						|
                {
 | 
						|
                    this.InfoBlock.Visibility = Visibility.Visible;
 | 
						|
                }
 | 
						|
                
 | 
						|
            });
 | 
						|
            
 | 
						|
        }
 | 
						|
 | 
						|
        public void ResetCurrentPageText()
 | 
						|
        {
 | 
						|
            this.Dispatcher.BeginInvoke(() =>
 | 
						|
            { 
 | 
						|
                this.CurrentPageText.Text = CurrentPage + "";
 | 
						|
            });
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |