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 + "";
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |