WPF自定义翻页控件

devtools/2024/11/14 7:19:32/

XAML文件如下:

<UserControlx:Class="CTMVVMDemo.View.UserControls.DataPager"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:CTMVVMDemo.View.UserControls"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Name="userControl"d:DesignHeight="450"d:DesignWidth="800"mc:Ignorable="d"><Grid><!--一个视图数据源一般情况来自两处:1。ViewModel2。.cs文件--><StackPanelHorizontalAlignment="Right"VerticalAlignment="Center"Orientation="Horizontal"><TextBlock Text="共" /><TextBlock Margin="4,0" Text="{Binding TotalCount, ElementName=userControl}" /><TextBlock Text="条记录,每页" /><ComboBoxGrid.Column="0"Width="60"Height="24"Margin="5,0,0,0"Padding="0"VerticalAlignment="Center"HorizontalContentAlignment="Center"VerticalContentAlignment="Center"Cursor="Hand"ItemsSource="{Binding ElementName=userControl, Path=PageSizes}"SelectedItem="{Binding PageSize, ElementName=userControl}" /><TextBlock Text="条,第" /><TextBlock Margin="4,0,2,0" Text="{Binding PageIndex, ElementName=userControl}" /><TextBlock Text="/" /><TextBlock Margin="2,0,4,0" Text="{Binding PageCount, ElementName=userControl}" /><TextBlock Text="页" /><Buttonx:Name="btnFirst"Margin="10,0,0,0"VerticalAlignment="Center"Click="btnFirst_Click"Content="首页"FontSize="14"IsEnabled="{Binding CanGoFirstOrPrev, ElementName=userControl}" /><Buttonx:Name="btnPrev"Margin="10,0,0,0"VerticalAlignment="Center"Click="btnPrev_Click"Content="上一页"FontSize="14"IsEnabled="{Binding CanGoFirstOrPrev, ElementName=userControl}" /><Buttonx:Name="btnNext"Margin="10,0,10,0"VerticalAlignment="Center"Click="btnNext_Click"Content="下一页"FontSize="14"IsEnabled="{Binding CanGoLastOrNext, ElementName=userControl}" /><Buttonx:Name="btnLast"Margin="10,0,10,0"VerticalAlignment="Center"Click="btnLast_Click"Content="末页"FontSize="14"IsEnabled="{Binding CanGoLastOrNext, ElementName=userControl}" /></StackPanel></Grid>
</UserControl>

依赖属性的代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;namespace CTMVVMDemo.View.UserControls
{public partial class DataPager : UserControl, INotifyPropertyChanged{public DataPager(){InitializeComponent();}#region 路由事件public static readonly RoutedEvent PageChangedEvent = EventManager.RegisterRoutedEvent("PageChanged",RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(DataPager));public event RoutedEventHandler PageChanged{add { AddHandler(PageChangedEvent, value); }remove { RemoveHandler(PageChangedEvent, value); }}#endregion#region 依赖属性/// <summary>/// 当前页/// </summary>public int PageIndex{get { return (int)GetValue(PageIndexProperty); }set { SetValue(PageIndexProperty, value); }}public static readonly DependencyProperty PageIndexProperty =DependencyProperty.Register("PageIndex",typeof(int),typeof(DataPager),new UIPropertyMetadata(1, (sender, e) =>{var dp = sender as DataPager;if (dp == null) return;dp.ChangeNavigationButtonState();}));/// <summary>/// 每页显示条数/// </summary>public int PageSize{get { return (int)GetValue(PageSizeProperty); }set { SetValue(PageSizeProperty, value); }}public static readonly DependencyProperty PageSizeProperty =DependencyProperty.Register("PageSize",typeof(int),typeof(DataPager),new UIPropertyMetadata(10, (sender, e) =>{var dp = sender as DataPager;if (dp == null) return;dp.InitData();dp.OnPageChanging(1);dp.ChangeNavigationButtonState();}));/// <summary>/// 总记录数量/// </summary>public int TotalCount{get { return (int)GetValue(TotalCountProperty); }set{SetValue(TotalCountProperty, value);}}public static readonly DependencyProperty TotalCountProperty =DependencyProperty.Register("TotalCount",typeof(int),typeof(DataPager),new UIPropertyMetadata(0, (sender, e) =>{var dp = sender as DataPager;if (dp == null) return;dp.InitData();dp.ChangeNavigationButtonState();}));/// <summary>/// 总页数/// </summary>public int PageCount{get { return (int)GetValue(PageCountProperty); }private set { SetValue(PageCountProperty, value); }}public static readonly DependencyProperty PageCountProperty =DependencyProperty.Register("PageCount", typeof(int), typeof(DataPager), new UIPropertyMetadata(1));public List<int> PageSizes{get { return (List<int>)GetValue(PageSizesProperty); }set { SetValue(PageSizesProperty, value); }}public static readonly DependencyProperty PageSizesProperty =DependencyProperty.Register("PageSizes",typeof(List<int>),typeof(DataPager),new PropertyMetadata(new List<int>() { 1, 10, 20, 30, 40, 50 }));#endregion 依赖属性#region 初始化/// <summary>/// 初始化数据/// </summary>void InitData(){// 根据记录总数计算总页数if (TotalCount == 0)PageCount = 1;elsePageCount = TotalCount % PageSize > 0 ? (TotalCount / PageSize) + 1 : TotalCount / PageSize;// 防止非法数据if (PageIndex < 1)PageIndex = 1;if (PageIndex > PageCount)PageIndex = PageCount;if (PageSize < 1)PageSize = 10;}#endregion#region 按钮逻辑/// <summary>/// 点击首页按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnFirst_Click(object sender, RoutedEventArgs e){OnPageChanging(1);}/// <summary>/// 点击上一页按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnPrev_Click(object sender, RoutedEventArgs e){OnPageChanging(PageIndex - 1);}/// <summary>/// 点击下一页按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnNext_Click(object sender, RoutedEventArgs e){OnPageChanging(PageIndex + 1);}/// <summary>/// 点击末页按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnLast_Click(object sender, RoutedEventArgs e){OnPageChanging(PageCount);}private void TxtPageIndex_PreviewTextInput(object sender, TextCompositionEventArgs e){Regex re = new Regex("[^0-9]+");e.Handled = re.IsMatch(e.Text);}/// <summary>/// 点击跳转按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnGoTo_Click(object sender, RoutedEventArgs e){int pageIndex = 1;try{//pageIndex = Convert.ToInt32(txtPageIndex.Text);}catch{}finally{OnPageChanging(pageIndex);}}#endregion/// <summary>/// 页码更改/// </summary>/// <param name="pageIndex"></param>private void OnPageChanging(int pageIndex){if (pageIndex < 1) pageIndex = 1;if (pageIndex > PageCount) pageIndex = PageCount;var eventArgs = new RoutedEventArgs(PageChangedEvent, this);PageIndex = pageIndex;RaiseEvent(eventArgs);}#region 控制按钮状态/// <summary>/// 是否可以点击首页和上一页按钮/// </summary>public bool CanGoFirstOrPrev{get{if (PageIndex <= 1) return false;return true;}}/// <summary>/// 是否可以点击最后页和下一页按钮/// </summary>public bool CanGoLastOrNext{get{if (PageIndex >= PageCount) return false;return true;}}/// <summary>/// 通知导航按钮(首页,上一页,下一页,末页)状态的更改/// </summary>void ChangeNavigationButtonState(){OnPropertyChanged("CanGoFirstOrPrev");OnPropertyChanged("CanGoLastOrNext");}#endregion#region INotifyPropertyChanged成员public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}#endregion INotifyPropertyChanged成员}
}

效果图:


http://www.ppmy.cn/devtools/133368.html

相关文章

如何稳定操作网站及稳定排名

稳定操作网站及排名的方法包括提升主题性、增加用户黏度、维护服务器稳定性等。稳定网站排名是一个长期且复杂的过程&#xff0c;需要从多个方面入手&#xff0c;确保网站在搜索引擎中的表现持续优秀。 稳定操作网站&#xff1a; 提升主题性&#xff1a;通过丰富与网站核心业务…

第十五天 数据可视化

Python 数据可视化是利用 Python 编程语言及其相关库来创建图形、图表和其他视觉表示&#xff0c;以便更好地理解和分析数据的过程。Python 提供了多种强大的数据可视化工具和库&#xff0c;使得数据科学家和分析师能够轻松地将复杂的数据集转化为易于理解的图形表示。 以下是…

Spring Boot与Spring Data JPA:简化数据库操作

在现代软件开发中&#xff0c;数据库操作是应用程序不可或缺的一部分。Spring Boot与Spring Data JPA提供了一种简洁而强大的方式&#xff0c;使得开发者可以轻松地实现数据库的增删改查&#xff08;CRUD&#xff09;操作&#xff0c;以及更复杂的查询需求。本文将介绍如何使用…

TypeScript:现代 JavaScript 的超级集

目录 为什么使用 TypeScript? TypeScript 的基本特性 TypeScript 的优势 TypeScript项目实战 简单的命令行任务管理系统 TypeScript 是由微软开发的一个开源编程语言,它是 JavaScript 的一个严格超集。TypeScript 的核心特性是静态类型检查,使得开发者可以在编写代码时…

二叉树(C 语言)

目录 一、树1. 树的概念2. 树的表示方法3. 树在实际当中的应用 二、二叉树1. 二叉树的定义2. 现实中的二叉树3. 特殊的二叉树4. 二叉树的性质5. 二叉树的存储结构 三、堆 —— 完全二叉树的顺序存储1. 堆的概念2. 堆的性质3. 堆的设计思路4. 堆的实现代码 四、堆排序1. 堆排序的…

Vue3 : Tailwindcss之margin样式类

margin 样式&#xff1a; 关键字数字间隔&#xff1a;m&#xff1a;四个方向1-12是连续的mx&#xff1a;水平方向12-52是间隔2my&#xff1a;垂直方向52到64间隔4mt&#xff1a;上边64以后间隔8mr&#xff1a;右边 mb&#xff1a;下边 ml&#xff1a;左边  基础样式: ClassP…

T507 buildroot linux4.9之AP6275S wifi/bt 以太网开发调试

文章目录 前言一、硬件确认1.1、RLT8211硬件二、驱动配置2.1、驱动位置2.2、使用config宏配置驱动2.3、ap6275s 驱动调试1)、ap6275s 的供电使能电压2)、WL_REG_ON,VBAT rst等io配置3)、bt通信的UART配置4)、晶振问题分析5)、AP6275S固件集成到系统三、BT协议栈以及工具配置四、…

若依前后端分离版部署(超详细)

一、简介 有些特殊情况需要部署到子路径下,例如:https://www.jzjtest.cn/admin-hb,可以按照下面流程修改。 二、实现步骤 2.1 后端部署 自定义后端端口 # 开发环境配置 server:# 服务器的HTTP端口,默认为8080port: 10081通过maven:package一键打包成jar 将jar上传到服务器…