WPF 分页控件的简单实现

想做个分页控件,想了想逻辑实现太复杂了,这不,用奇怪的方式实现了它,就如这张图一样。。。

看看效果:

下面就直接粘代码喽:

新建一个Pagination类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPFDemos
{public class Pagination : Control{private Button _btnPrev = null;private Button _btnOne = null;private Button _btnDotPrev = null;private Button _btnCenterOne = null;private Button _btnCenterTwo = null;private Button _btnCenterThree = null;private Button _btnCenterFour = null;private Button _btnCenterFive = null;private Button _btnDotNext = null;private Button _btnLast = null;private Button _btnNext = null;public int PageCount{get { return (int)GetValue(PageCountProperty); }set { SetValue(PageCountProperty, value); }}public static readonly DependencyProperty PageCountProperty =DependencyProperty.Register("PageCount", typeof(int), typeof(Pagination), new PropertyMetadata(1, (d, e) =>{if (!(d is Pagination pagination)) return;var page = (int)e.NewValue;pagination.IsSimple = page < 6;}));public bool IsSimple{get { return (bool)GetValue(IsSimpleProperty); }set { SetValue(IsSimpleProperty, value); }}public static readonly DependencyProperty IsSimpleProperty =DependencyProperty.Register("IsSimple", typeof(bool), typeof(Pagination), new PropertyMetadata(false));public int CurrentPage{get { return (int)GetValue(CurrentPageProperty); }set { SetValue(CurrentPageProperty, value); }}public static readonly DependencyProperty CurrentPageProperty =DependencyProperty.Register("CurrentPage", typeof(int), typeof(Pagination), new PropertyMetadata(1, (d, e) =>{if (!(d is Pagination pagination)) return;if (pagination.PageCount > 5){pagination.UpdateControl();}else{pagination.UpdateControlSimple();}}));public override void OnApplyTemplate(){base.OnApplyTemplate();if (PageCount > 5){InitControls();}else{InitControlsSimple();}}private List<Button> _simpleButtons = new List<Button>();private void InitControlsSimple(){_btnPrev = GetTemplateChild("btnPrev") as Button;_btnCenterOne = GetTemplateChild("btnCenterOne") as Button;_btnCenterTwo = GetTemplateChild("btnCenterTwo") as Button;_btnCenterThree = GetTemplateChild("btnCenterThree") as Button;_btnCenterFour = GetTemplateChild("btnCenterFour") as Button;_btnCenterFive = GetTemplateChild("btnCenterFive") as Button;_btnNext = GetTemplateChild("btnNext") as Button;_simpleButtons.Clear();_simpleButtons.Add(_btnCenterOne);_simpleButtons.Add(_btnCenterTwo);_simpleButtons.Add(_btnCenterThree);_simpleButtons.Add(_btnCenterFour);_simpleButtons.Add(_btnCenterFive);BindClickSimple();UpdateControlSimple();}private void UpdateControlSimple(){_btnCenterOne.Visibility = PageCount >= 1 ? Visibility.Visible : Visibility.Collapsed;_btnCenterTwo.Visibility = PageCount >= 2 ? Visibility.Visible : Visibility.Collapsed;_btnCenterThree.Visibility = PageCount >= 3 ? Visibility.Visible : Visibility.Collapsed;_btnCenterFour.Visibility = PageCount >= 4 ? Visibility.Visible : Visibility.Collapsed;_btnCenterFive.Visibility = PageCount >= 5 ? Visibility.Visible : Visibility.Collapsed;_btnPrev.IsEnabled = CurrentPage > 1;_btnNext.IsEnabled = CurrentPage < PageCount;_btnCenterOne.Background = _btnCenterTwo.Background = _btnCenterThree.Background = _btnCenterFour.Background = _btnCenterFive.Background = Brushes.LightBlue;_simpleButtons[CurrentPage - 1].Background = Brushes.Green;}private void BindClickSimple(){_btnPrev.Click += (s, e) => CurrentPage -= 1;_btnCenterOne.Click += (s, e) => CurrentPage = 1;_btnCenterTwo.Click += (s, e) => CurrentPage = 2;_btnCenterThree.Click += (s, e) => CurrentPage = 3;_btnCenterFour.Click += (s, e) => CurrentPage = 4;_btnCenterFive.Click += (s, e) => CurrentPage = 5;_btnNext.Click += (s, e) => CurrentPage += 1;}private void InitControls(){_btnPrev = GetTemplateChild("btnPrev") as Button;_btnOne = GetTemplateChild("btnOne") as Button;_btnDotPrev = GetTemplateChild("btnDotPrev") as Button;_btnCenterOne = GetTemplateChild("btnCenterOne") as Button;_btnCenterTwo = GetTemplateChild("btnCenterTwo") as Button;_btnCenterThree = GetTemplateChild("btnCenterThree") as Button;_btnCenterFour = GetTemplateChild("btnCenterFour") as Button;_btnCenterFive = GetTemplateChild("btnCenterFive") as Button;_btnDotNext = GetTemplateChild("btnDotNext") as Button;_btnLast = GetTemplateChild("btnLast") as Button;_btnNext = GetTemplateChild("btnNext") as Button;BindClick();UpdateControl();}private void BindClick(){_btnPrev.Click += (s, e) => SetIndex(-1);_btnOne.Click += (s, e) => SetIndex(1 - CurrentPage);_btnDotPrev.Click += (s, e) => SetIndex(-3);_btnCenterOne.Click += (s, e) => SetIndex(-2);_btnCenterTwo.Click += (s, e) => SetIndex(-1);_btnCenterFour.Click += (s, e) => SetIndex(1);_btnCenterFive.Click += (s, e) => SetIndex(2);_btnDotNext.Click += (s, e) => SetIndex(3);_btnLast.Click += (s, e) => SetIndex(PageCount - CurrentPage);_btnNext.Click += (s, e) => SetIndex(1);}public void SetIndex(int page){if (page < 0){if (CurrentPage + page > 0){CurrentPage += page;}}else if (page > 0){if (CurrentPage + page <= PageCount){CurrentPage += page;}}}private void UpdateControl(){_btnPrev.IsEnabled = CurrentPage > 1;_btnOne.Visibility = CurrentPage < 4 ? Visibility.Collapsed : Visibility.Visible;_btnDotPrev.Visibility = CurrentPage < 4 ? Visibility.Collapsed : Visibility.Visible;_btnCenterOne.Visibility = CurrentPage != 3 && CurrentPage != PageCount ? Visibility.Collapsed : Visibility.Visible;_btnCenterTwo.Visibility = CurrentPage == 1 || (PageCount - CurrentPage) == 2 ? Visibility.Collapsed : Visibility.Visible;_btnCenterFour.Visibility = CurrentPage == 3 || CurrentPage == PageCount ? Visibility.Collapsed : Visibility.Visible;_btnCenterFive.Visibility = CurrentPage != 1 && (PageCount - CurrentPage) != 2 ? Visibility.Collapsed : Visibility.Visible;_btnDotNext.Visibility = PageCount - CurrentPage < 3 ? Visibility.Collapsed : Visibility.Visible;_btnLast.Visibility = PageCount - CurrentPage < 3 ? Visibility.Collapsed : Visibility.Visible;_btnNext.IsEnabled = CurrentPage != PageCount;_btnOne.Content = 1;_btnCenterOne.Content = CurrentPage - 2;_btnCenterTwo.Content = CurrentPage - 1;_btnCenterThree.Content = CurrentPage;_btnCenterFour.Content = CurrentPage + 1;_btnCenterFive.Content = CurrentPage + 2;_btnLast.Content = PageCount;}}
}

在App.xaml内新增样式:

 <Style x:Key="PageBtn" TargetType="Button"><Setter Property="FocusVisualStyle" Value="{x:Null}"/><Setter Property="MinWidth" Value="35"/><Setter Property="Margin" Value="3 0"/><Setter Property="Padding" Value="0"/><Setter Property="Background" Value="LightBlue"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border x:Name="border" CornerRadius="6" Background="{TemplateBinding Background}"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/></Border><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="True" SourceName="border"><Setter Property="Background" Value="Red" TargetName="border"/></Trigger><Trigger Property="IsEnabled" Value="False"><Setter Property="Background" Value="Gray" TargetName="border"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style><Style x:Key="PageCurrent" TargetType="Button"><Setter Property="FocusVisualStyle" Value="{x:Null}"/><Setter Property="MinWidth" Value="35"/><Setter Property="Margin" Value="3 0"/><Setter Property="Padding" Value="0"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border x:Name="border" CornerRadius="6" Background="Green"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/></Border></ControlTemplate></Setter.Value></Setter>
</Style><Style TargetType="local:Pagination"><Setter Property="FocusVisualStyle" Value="{x:Null}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:Pagination"><StackPanel Orientation="Horizontal"><Button Style="{StaticResource PageBtn}" x:Name="btnPrev" Content="上一页"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnOne" Content="1"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnDotPrev" Content="..."></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterOne" Content="1"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterTwo" Content="2"></Button><Button Style="{StaticResource PageCurrent}" x:Name="btnCenterThree" Content="3"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterFour" Content="4"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterFive" Content="5"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnDotNext" Content="..."></Button><Button Style="{StaticResource PageBtn}" x:Name="btnLast" Content="5"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnNext" Content="下一页"></Button></StackPanel></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsSimple" Value="True"><Setter Property="Template" ><Setter.Value><ControlTemplate TargetType="local:Pagination"><StackPanel Orientation="Horizontal"><Button Style="{StaticResource PageBtn}" x:Name="btnPrev" Content="上一页"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterOne" Content="1"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterTwo" Content="2"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterThree" Content="3"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterFour" Content="4"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnCenterFive" Content="5"></Button><Button Style="{StaticResource PageBtn}" x:Name="btnNext" Content="下一页"></Button></StackPanel></ControlTemplate></Setter.Value></Setter></Trigger></Style.Triggers>
</Style>

MainWindow测试代码如下:

<Window x:Class="WPFDemos.MainWindow"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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPFDemos"mc:Ignorable="d"x:Name="widnow"WindowStartupLocation="CenterScreen"UseLayoutRounding="True"Background="White"FontSize="16"Title="分页" Height="500" Width="1000"><Grid><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"><local:Pagination x:Name="pag0" PageCount="3" Height="35" HorizontalAlignment="Center"/><TextBlock Margin="10" HorizontalAlignment="Center"><Run Text="当前页:"/><Run Text="{Binding CurrentPage,ElementName=pag0}"/></TextBlock><local:Pagination x:Name="pag" PageCount="5" Height="35" HorizontalAlignment="Center"/><TextBlock Margin="10" HorizontalAlignment="Center"><Run Text="当前页:"/><Run Text="{Binding CurrentPage,ElementName=pag}"/></TextBlock><local:Pagination x:Name="pag1" PageCount="35" Height="35" /><TextBlock Margin="10" HorizontalAlignment="Center"><Run Text="当前页:"/><Run Text="{Binding CurrentPage,ElementName=pag1}"/></TextBlock></StackPanel></Grid>
</Window>

效果图:

以上就是全部代码喽,喜欢的小伙伴点个赞吧~

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302009.shtml

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

相关文章

两向量点乘坐标运算_高三数学冲刺复习之向量小题的题型总结(含好用的补充公式)...

高考中&#xff0c;向量小题常从以下几个方面来考查&#xff1a;1、平面向量的有关概念与平面向量的线性运算&#xff0c;主要考查向量的加法、减法运算&#xff0c;考查向量的数乘运算及其几何意义。2、考查平面向量的坐标&#xff1a;主要考查平面向量基本定理及其意义&#…

全球最厉害的14位程序员!

全世界只有3.14 % 的人关注了数据与算法之美导读&#xff1a;全球最厉害的14位程序员是谁&#xff1f;一起来看下让我们膜拜的这些大神都有哪些&#xff1f;&#xff08;排名不分先后&#xff09;01 Jon Skeet个人名望&#xff1a;程序技术问答网站Stack Overflow总排名第一的大…

.net5或.net6(Preview) 之 顶级语句

创建一个控制台项目&#xff0c;.net5或.net6(Preview)&#xff0c;在Program.cs中写如下代码&#xff0c;F5&#xff0c;能顺利跑起来&#xff0c;没有Program类&#xff0c;没有Main函数。这是C#9带来的顶级语句的功能。System.Console.WriteLine("你好,C#");其实这…

班尼机器人维修方法_梅州市ABB机器人控制器维修中心

梅州市ABB机器人控制器维修中心库卡机器人KSP600-3X64库卡KSP控制器驱动器报警KSP600-3X64/00198268KSP600-3x20/ECMAS3D2224BE531/KSP600-3x40/ECMAS3D4444BE531/产品名称:库卡KSP600-3X64伺服包维修库卡KR控制系统伺服包型号:库卡机器人驱动模块KSP600-3x20/ECMAS3D2224BE531…

c# 获取当前活动窗口句柄,获取窗口大小及位置

2019独角兽企业重金招聘Python工程师标准>>> 需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllImport("user32.dll", CharSet CharSet.Auto, ExactSpelling true)] public stat…

Uno 平台 一 WinUI终极跨平台方案(二)

上篇《Uno 平台 一 WinUI终极跨平台方案&#xff08;一&#xff09;》简单介绍了Uno平台3.6版本的更新内容&#xff0c;大家评论里持怀疑态度的人很多&#xff0c;主要还是Uno平台非微软官方发布&#xff0c;咱们.net技术方向的已经习惯于在微软一家技术支持下&#xff0c;最多…

java 方法执行结束局部变量释放_Java方法执行的内存模型

Java虚拟机栈&#xff1a;Java方法执行的内存模型Java虚拟机栈&#xff1a;Java方法执行的内存模型Java方法执行的内存模型当前线程&#xff1a;当前栈帧局部变量表操作数栈动态链接返回地址等信息...栈帧3栈帧2栈帧1线程3线程2线程1每个方法一被调用&#xff0c;就会有一个栈帧…

程序员单身真的是有理由的吗?

全世界只有3.14 % 的人关注了数据与算法之美因为特殊职业的缘故程序员身边的女孩可谓是少之又少工作忙碌&#xff0c;没时间谈恋爱所有单身也就不足为奇了不过&#xff0c;通过我们观察&#xff0c;还是有不少程序员早早脱了单至于&#xff0c;脱单失败的各位&#xff0c;那真的…

瞒不住了,难怪.NET进大厂这么难!

六一儿童节&#xff0c;代表着金三银四铜五的跳槽季正式过去了&#xff0c;几家欢喜几家愁&#xff01;既看到微软腾讯阿里百度的大厂offer&#xff0c;又不禁羡慕30k、40k、50k的高薪&#xff0c;当然更多的&#xff0c;其实还是各种面试被怼的故事。成功的经验五花八门&#…

华为Mate30与大疆手机云台3_更便捷更从容,大疆DJI OM 4手机云台使用体验

不多不少&#xff0c;距离2019年的8月正好过去了一年。在去年8月&#xff0c;大疆为消费者带来了全新的手机云台——OSMO Mobile 3&#xff0c;其最大特点莫过于采用可折叠式的机身设计以及那仅为405g的云台重量&#xff0c;让手机云台随身携带不再是一种累赘&#xff0c;而是一…

数理思维这样培养才有效,从小就赢在方法上,每本不足3元!!

▲卢sir特别推荐点击上图进入玩酷屋重视教育的家长会发现&#xff0c;以前盛行的“学好数理化&#xff0c;走遍天下都不怕”&#xff0c;现在教育部和学校都超重视的STEAM教育&#xff0c;数学和物理一直都是其中最为重要的学科。从长远的教育来看&#xff0c;数理思维好的孩子…

16 个 Linux 服务器监控命令和watch

如果你想知道你的服务器正在做干什么&#xff0c;你就需要了解一些基本的命令&#xff0c;一旦你精通了这些命令&#xff0c;那你就是一个 专业的 Linux 系统管理员。 有些 Linux 发行版会提供 GUI 程序来进行系统的监控&#xff0c;例如 SUSE Linux 就有一个非常棒而且专业的工…

计算机的科学原理是什么,人工智能的工作原理是什么?

原标题&#xff1a;人工智能的工作原理是什么&#xff1f;人工智能的工作原理是&#xff1a;计算机会通过传感器(或人工输入的方式)来收集关于某个情景的事实。计算机将此信息与已存储的信息进行比较&#xff0c;以确定它的含义。计算机会根据收集来的信息计算各种可能的动作&a…

世界头号毒枭古斯曼被捕,全因被内部IT男出卖!

全世界只有3.14 % 的人关注了数据与算法之美近段时间&#xff0c;纽约布鲁克林联邦地区法院上上下下可说是忙得不可开交&#xff0c;因为他们从2018年11月开始到现在都没处理完这个“大单子”——审理世界头号毒枭古斯曼。2008年度《福布斯》“全球亿万富豪榜”第701位&#xf…

APP-V5.0的Sequencer过程

首先我准备好了一台纯净的Windows 7 x86系统&#xff08;不加域&#xff09;来作为我的捕获母机系统&#xff01;那么首先我们的这个Windows 7需要安装上.net4.0才行。接着是安装powershell3.0http://www.microsoft.com/en-us/download/details.aspx?id34595接着是安装KB25336…

WPF 分页控件添加路由事件

昨天的代码经过大佬的指点&#xff0c;又优化了一下&#xff0c;看看优化了哪些&#xff1a;在Pagination类中添加事件定义&#xff1a;public static readonly RoutedEvent IndexChangedEvent EventManager.RegisterRoutedEvent("IndexChanged", RoutingStrategy.B…

项目管理六大制约因素_用PCTS理念做好项目管理规划(优秀项目管理者必知)...

谈到项目管理的理念&#xff0c;很多人所熟知的大概是项目管理的三重约束——质量、时间和成本。每一个管理者当然都希望自己的项目可以质量好&#xff0c;时间花费少以及成本低&#xff0c;然而事实往往不尽人意&#xff0c;你必须选择其中一个作为变量来保证其他两者的定量&a…

你的孩子缺什么?不再是知识!看完后明白了

▲卢sir特别推荐点击上图进入玩酷屋中国孩子缺什么&#xff1f;不再是知识是独立思考意识、逻辑思维能力基于科学的价值观中小学教师的课堂助手素质教育抓什么&#xff1f;不能是知识是人类文明史、基本科学态度初步的审美能力科技工作者的创新思想库科技创新靠什么&#xff1f…

OceanBase开源,11张图带你了解分布式数据库的核心知识

蚂蚁集团自研数据库OceanBase已经开源&#xff0c;这对国产分布式数据库来说&#xff0c;是一个重磅消息。一直以来OceanBase作为商业数据库&#xff0c;披露的技术细节并不多,以后又多了一个可以拿来研究的优秀分布式数据库。参考1[1]根据官网描述&#xff0c;在5月20日国际事…

[转]order by 多个排序条件

为什么80%的码农都做不了架构师&#xff1f;>>> http://apps.hi.baidu.com/share/detail/19346201 ORDER子句按一个或多个&#xff08;最多16个&#xff09;字段排序查询结果&#xff0c;可以是升序&#xff08;ASC&#xff09;也可以是降序&#xff08;DESC&#…