WPF自定义翻页控件

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.rhkb.cn/news/467934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…

【react】Redux基础用法

1. Redux基础用法 Redux 是一个用于 JavaScript 应用的状态管理库&#xff0c;它不依赖于任何 UI库&#xff0c;但常用于与 React 框架配合使用。它提供了一种集中式的状态管理方式&#xff0c;将应用的所有状态保存在一个单一的全局 Store&#xff08;存储&#xff09;中&…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…

Docker的轻量级可视化工具Portainer

docker目录 1 Portainer官方链接2 是什么&#xff1f;3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接&#xff1a;https://www.portainer.io/ portainer安装的官方链接&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/l…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

【c++丨STL】vector模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…

C++中类的默认成员函数

默认成员函数 1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载4.1运算符重载4.2赋值运算符重载 #mermaid-svg-oipiwg9stvONvYK0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oipiwg9stvONvYK0 .error-icon{f…

数据编排与ETL有什么关系?

数据编排作为近期比较有热度的一个话题&#xff0c;讨论度比较高&#xff0c;同时数据编排的出现也暗示着数字化进程的自动化发展。在谈及数据编排时&#xff0c;通常也会谈到ETL&#xff0c;这两个东西有相似点也有不同点。 数据编排和ETL&#xff08;提取、转换、加载&#x…

【SpringCloud】SpringBoot集成Swagger 常用Swagger注解

概述&#xff1a;SpringBoot集成Swagger 常用Swagger注解 导语 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前…

革命性AI搜索引擎!ChatGPT最新功能发布,无广告更智能!

文章目录 零、前言一、ChatGPT最新AI搜索引擎功能操作指导实战1:搜索新闻实战2:搜索天气实战3:搜索体育消息 二、感受 零、前言 大人&#xff0c;时代变了。 最强 AI 助力下的无广告搜索引擎终于问世。我们期待已久的这一刻终于到来了&#xff0c;从今天起&#xff0c;ChatGPT…

基于 CMSIS-PACK 移植Bootloader

基于 CMSIS-PACK 移植 1.准备工作 准备一份基础的裸机源码 (可通过 STM32CubeMx 可视化软件创建也可按照工程项目所需文档手动创建) 工程&#xff0c;如一份 stm32 包含一个支持 printf 的串口初始化代码。 2.安装Pack包 在 MDK 中部署 **MicroBoot **的第一步是获取对应的…

苍穹外卖day09超出配送范围前端不提示问题

同学们在写苍穹外卖项目day09时调用了百度地图api来判断用户地址是否超出配送范围&#xff0c; 但是在黑马官方的课程或资料中&#xff0c;出现这样的问题时只会向用户端的控制台报错并不会提醒用户 如下图&#xff1a; 解决方法&#xff1a; 其实解决方法很简单只需要找到向…

嵌入式linux中PWM控制与实现

大家好,今天主要给大家分享一下,如何使用linux系统里面的PWM的功能,可以控制对应电机的转速。 第一:PWM驱动基本简介 PWM就是脉冲宽度调制。 PWM信号有两个关键术语:频率和占空比,频率指的是开关的速度。占空比就是一个周期内高电平和低电平时间的比例,一个周期内高电…

CUDA系统学习之一软件堆栈架构

一、CPU与GPU体系架构 计算单元分布 CPU: 少量强大的ALU(算术逻辑单元)&#xff0c;通常4-8个核心GPU: 大量小型ALU&#xff0c;成百上千个计算核心特点&#xff1a;GPU更适合并行计算&#xff0c;可以同时处理大量数据控制单元(Control) CPU: 较大的控制单元&#xff0c;复杂的…

「QT」几何数据类 之 QPoint 整型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

0x00基础算法 -- 0x01 位运算

资料来源&#xff1a;算法竞赛进阶指南活动 - AcWing 1、进制表示 二进制表示&#xff1a;m位二进制中&#xff0c;通常称最低位为第0位&#xff0c;从右到左以此类推&#xff0c;最高位为第m-1位。 常用十六进制表示的数字&#xff1a; 32位补码int&#xff08;十进制&#xf…

H5移动端预览PDF方法

新建页面 新建一个页面以便去预览对应的pdf 新建完后在 pages.json 文件内去新增对应路由 页面内容 <template><view class"page"><view class"pdf"><view id"demo"></view></view><view class"b…