WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件
做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码改变事件暴露出来,数据的加载在这里就做就行,所以这个分页控件很简单...
好像也没啥讲的,直接上代码了
分页控件基本样式
<Style TargetType="{x:Type local:Pager}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Pager}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Horizontal"
VerticalAlignment="Center">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment"
Value="Center"></Setter>
</Style>
</StackPanel.Resources>
<TextBlock Text="共"></TextBlock>
<TextBlock x:Name="PART_TotalCount">
</TextBlock>
<TextBlock Text="行,"></TextBlock>
<TextBlock Text="每页"></TextBlock>
<TextBlock x:Name="PART_PageSize">
</TextBlock>
<TextBlock Text="行,"></TextBlock>
<TextBlock Text="第">
</TextBlock>
<TextBlock x:Name="PART_PageIndex"></TextBlock>
<TextBlock Text="/"></TextBlock>
<TextBlock x:Name="PART_TotalPage"></TextBlock>
<TextBlock Text="页"></TextBlock>
<Button Margin="10,0,0,0"
Content="首页"
x:Name="PART_FirstPage"></Button>
<Button Margin="10,0,0,0"
Content="上一页"
x:Name="PART_PrePage"></Button>
<Button Margin="10,0,0,0"
Content="下一页"
x:Name="PART_NextPage"></Button>
<Button Margin="10,0,10,0"
Content="尾页"
x:Name="PART_LastPage"></Button>
<TextBox Width="50"
x:Name="PART_PageNum"></TextBox>
<Button Margin="10,0,0,0"
Content="转到"
x:Name="PART_PageGo"></Button>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
分页控件代码
[TemplatePart(Name = "PART_TotalCount", Type = typeof(TextBlock))]
[TemplatePart(Name = "PART_PageSize", Type = typeof(TextBlock))]
[TemplatePart(Name = "PART_PageIndex", Type = typeof(TextBlock))]
[TemplatePart(Name = "PART_TotalPage", Type = typeof(TextBlock))]
[TemplatePart(Name = "PART_FirstPage", Type = typeof(Button))]
[TemplatePart(Name = "PART_PrePage", Type = typeof(Button))]
[TemplatePart(Name = "PART_NextPage", Type = typeof(Button))]
[TemplatePart(Name = "PART_LastPage", Type = typeof(Button))]
[TemplatePart(Name = "PART_PageGo", Type = typeof(Button))]
[TemplatePart(Name = "PART_PageNum", Type = typeof(TextBox))]
public class Pager : Control
{
#region 字段
private TextBlock _txtTotalCount;
private TextBlock _txtPageSize;
private TextBlock _txtPageIndex;
private TextBlock _txtTotalPage;
private Button _btnFirstPage;
private Button _btnPrePage;
private Button _btnNextPage;
private Button _btnLastPage;
private Button _btnPageGo;
private TextBox _txtBoxPageNum;
#endregion
#region 静态构造
static Pager()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Pager), new FrameworkPropertyMetadata(typeof(Pager)));
}
#endregion
#region 依赖属性
#region 总记录数
public int TotalCount
{
get
{
return (int)GetValue(TotalCountProperty);
}
set
{
SetValue(TotalCountProperty, value);
}
}
// Using a DependencyProperty as the backing store for TotalCount. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TotalCountProperty =
DependencyProperty.Register("TotalCount", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
(obj, e) =>
{
var pager = obj as Pager;
if (pager == null) return;
pager.SetTotalCount((int)e.NewValue);
}));
#endregion
#region 每页大小
public int PageSize
{
get
{
return (int)GetValue(PageSizeProperty);
}
set
{
SetValue(PageSizeProperty, value);
}
}
// Using a DependencyProperty as the backing store for PageSize. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PageSizeProperty =
DependencyProperty.Register("PageSize", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
(obj, e) =>
{
var pager = obj as Pager;
if (pager == null) return;
pager.SetPageSize((int)e.NewValue);
}));
#endregion
#region 当前页
public int PageIndex
{
get
{
return (int)GetValue(PageIndexProperty);
}
set
{
SetValue(PageIndexProperty, value);
}
}
// Using a DependencyProperty as the backing store for PageIndex. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PageIndexProperty =
DependencyProperty.Register("PageIndex", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
(obj, e) =>
{
var pager = obj as Pager;
if (pager == null) return;
pager.SetPageIndex((int)e.NewValue);
}));
#endregion
#region 总页数
public int TotalPage
{
get
{
return (int)GetValue(TotalPageProperty);
}
set
{
SetValue(TotalPageProperty, value);
}
}
// Using a DependencyProperty as the backing store for TotalPage. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TotalPageProperty =
DependencyProperty.Register("TotalPage", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
(obj, e) =>
{
var pager = obj as Pager;
if (pager == null) return;
pager.SetTotalPage((int)e.NewValue);
}));
#endregion
#endregion
#region 路由事件
public static readonly RoutedEvent PageChangedEvent = EventManager.RegisterRoutedEvent("PageChanged",
RoutingStrategy.Bubble, typeof(EventHandler<PageChangedEventArg>), typeof(Pager));
public event EventHandler<PageChangedEventArg> PageChanged
{
add
{
this.AddHandler(PageChangedEvent, value);
}
remove
{
this.RemoveHandler(PageChangedEvent, value);
}
}
protected virtual void OnPageChanged()
{
var pageChangedEventArg = new PageChangedEventArg(PageIndex);
pageChangedEventArg.RoutedEvent = PageChangedEvent;
pageChangedEventArg.Source = this;
this.RaiseEvent(pageChangedEventArg);
}
#endregion
#region 方法
public void SetTotalPage(int totalPage)
{
_txtTotalPage.Text = totalPage.ToString();
}
public void SetPageIndex(int pageIndex)
{
_txtPageIndex.Text = pageIndex.ToString();
}
public void SetPageSize(int pageSize)
{
_txtPageSize.Text = pageSize.ToString();
}
/// <summary>
/// 设置总记录数
/// </summary>
/// <param name="totalCount"></param>
public void SetTotalCount(int totalCount)
{
_txtTotalCount.Text = totalCount.ToString();
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_txtTotalCount = GetTemplateChild("PART_TotalCount") as TextBlock;
_txtPageSize = GetTemplateChild("PART_PageSize") as TextBlock;
_txtPageIndex = GetTemplateChild("PART_PageIndex") as TextBlock;
_txtTotalPage = GetTemplateChild("PART_TotalPage") as TextBlock;
_btnFirstPage = GetTemplateChild("PART_FirstPage") as Button;
_btnPrePage = GetTemplateChild("PART_PrePage") as Button;
_btnNextPage = GetTemplateChild("PART_NextPage") as Button;
_btnLastPage = GetTemplateChild("PART_LastPage") as Button;
_btnPageGo = GetTemplateChild("PART_PageGo") as Button;
_btnFirstPage.Click += _btnFirstPage_Click;
_btnPrePage.Click += _btnPrePage_Click;
_btnNextPage.Click += _btnNextPage_Click;
_btnLastPage.Click += _btnLastPage_Click;
_btnPageGo.Click += _btnPageGo_Click;
_txtBoxPageNum = GetTemplateChild("PART_PageNum") as TextBox;
}
#endregion
#region 私有方法
private void _btnPageGo_Click(object sender, RoutedEventArgs e)
{
var pageNum = 1;
if (int.TryParse(_txtBoxPageNum.Text, out pageNum))
{
if (pageNum >= 1 && pageNum <= TotalPage)
{
PageIndex = pageNum;
OnPageChanged();
}
}
}
private void _btnLastPage_Click(object sender, RoutedEventArgs e)
{
PageIndex = TotalPage;
OnPageChanged();
}
private void _btnNextPage_Click(object sender, RoutedEventArgs e)
{
if (PageIndex < TotalPage)
{
PageIndex++;
OnPageChanged();
}
}
private void _btnPrePage_Click(object sender, RoutedEventArgs e)
{
if (PageIndex > 1)
{
PageIndex--;
OnPageChanged();
}
}
private void _btnFirstPage_Click(object sender, RoutedEventArgs e)
{
PageIndex = 1;
OnPageChanged();
}
#endregion
}
事件参数 PageChangedEventArg.cs
public class PageChangedEventArg : RoutedEventArgs
{
public int PageIndex
{
get; set;
}
public PageChangedEventArg(int pageIndex) : base()
{
PageIndex = pageIndex;
}
}
Demo和源码都在开源中国上
WPF自定义分页控件,样式自定义,简单易用的更多相关文章
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
- WPF 4 DataGrid 控件(自定义样式篇)
原文:WPF 4 DataGrid 控件(自定义样式篇) 在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...
- asp.net webform 自定义分页控件
做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- Mvc自定义分页控件
MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...
- arcgis api 3.x for js 共享干货系列之二自定义 Navigation 控件样式风格(附源码下载)
0.内容概览 自定义 Navigation 控件样式风格 源码下载 1.内容讲解 arcgis api 3.x for js 默认的Navigation控件样式风格如下图:这样的风格不能说不好,各有各 ...
- 抛砖引玉 【镜像控件】 WPF实现毛玻璃控件不要太简单
原文:抛砖引玉 [镜像控件] WPF实现毛玻璃控件不要太简单 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/articl ...
- WPF设置全局控件样式
原文:WPF设置全局控件样式 方法: 在资源文件APP.XAML中添加如下资源 <Application x:Class="_360UI.App" xmlns="h ...
随机推荐
- Reporting Services无法连接ORACLE,提示:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本
Reporting Services无法连接ORACLE,在服务器安装ORACLE 11客户端版本后仍然提示以下错误: System.Data.OracleClient 需要 Oracle 客户端软件 ...
- [hdu4662]MU Puzzle(找规律)
题意:给你一个串MI,按照三种规则1:M后面的部分加倍 2:III->U 3:删去连续的两个UU.看看能否变为给定的串 解题关键:将所有的U转化为I,发现 t+k*6=2^i -> =2^ ...
- 杭电acm 1022题
Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...
- APP中的存储路径
访问SD卡 所需权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/& ...
- Cocos creator之javascript闭包
.什么是闭包? 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回 ...
- 洛谷P3043 [USACO12JAN]牛联盟Bovine Alliance
P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...
- bzoj2502: 清理雪道(有源汇有上下界最小流)
传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...
- [转]SE43 修改SAP标准菜单、登陆界面、背景图片
1.事务码se43 复制标准菜单S000 到 ZS000 2.按实际需要修改 ZS000 3.在事务码SSM2中用ZS000 代替 S000 4.注销后重新登陆 o 修改SAP登陆界面(在本博客 ...
- plpython 中文分词Windows下 PG数据库jieba分词
windows 下安装版本匹配python-3.4.3.amd64.msipostgresql-10.1-2-windows-x64.exe create language plpython3u;se ...
- [Inside HotSpot] Epsilon GC
1. Epsilon GC简介 Epsilon GC源于RedHat开发者Aleksey Shipilëv提交的一份JEP 318: Epsilon: A No-Op Garbage Collecto ...