本文为伪原创原文为 NET未来之路的https://www.cnblogs.com/lonelyxmas/p/10641255.html

原文中,页码数量会不断增加,会将下一页的按钮顶出去

修改了一下本人认为不合理的地方,以供学习。

效果:

下面代码

前台:

<UserControl x:Class="SwitchModule.Controls.Pager"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SwitchModule.Controls"
mc:Ignorable="d"
>
<UserControl.Resources> <PathGeometry x:Key="prev" Figures="M921.6 1024 102.4 1024C45.824 1024 0 978.176 0 921.6L0 102.4C0 45.824 45.824 0 102.4 0L921.6 0C978.176 0 1024 45.824 1024 102.4L1024 921.6C1024 978.176 978.176 1024 921.6 1024ZM640.1536 226.1504C633.088 226.1504 626.7904 229.2224 622.3872 234.0864L361.3184 495.1552 361.3184 495.1552C357.0176 499.456 354.304 505.4464 354.304 512.1024 354.304 518.6048 356.9152 524.544 361.1648 528.8448L361.1648 528.896 622.848 790.5792C623.0016 790.7328 623.104 790.8352 623.2576 790.9888L623.2576 790.9888C627.6096 795.1872 634.2144 794.8288 639.9488 797.7984 673.9968 815.36 687.872 787.0976 687.872 773.8368 687.872 767.3856 685.312 761.4976 681.1136 757.1968L681.1136 757.1968 680.96 757.0432C680.9088 756.992 680.8576 756.9408 680.8064 756.8896L436.0192 512.1024 681.1136 267.008 681.1136 267.008C685.4144 262.656 691.968 255.4368 688.0768 250.0608 654.4896 203.264 653.3632 226.1504 640.1536 226.1504Z"></PathGeometry> <Style x:Key="PrevPage" TargetType="{x:Type Button}">
<!--<Setter Property="Width" Value="30"></Setter>-->
<Setter Property="Height" Value="28"></Setter>
<Setter Property="Foreground" Value="#22CB64"></Setter>
<Setter Property="Background" Value="Transparent"></Setter>
<Setter Property="BorderThickness" Value="0"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="PART_root" CornerRadius="3" BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<Viewbox Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Path Data="{StaticResource prev}" Fill="{Binding Path=Foreground,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource TemplatedParent}}"></Path>
</Viewbox>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#FFB800"></Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Background" Value="#22CB64"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Gray"></Setter>
<Setter Property="Background" Value="Black"></Setter>
</Trigger>
</Style.Triggers>
</Style> <Style x:Key="NextPage" TargetType="{x:Type Button}">
<!--<Setter Property="Width" Value="30"></Setter>-->
<Setter Property="Height" Value="28"></Setter>
<Setter Property="Foreground" Value="#22CB64"></Setter>
<Setter Property="Background" Value="Transparent"></Setter>
<Setter Property="BorderThickness" Value="0"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="PART_root" CornerRadius="3" BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<Viewbox Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Path Data="{StaticResource prev}" RenderTransformOrigin="0.5,0.5" Fill="{Binding Path=Foreground,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource TemplatedParent}}">
<Path.RenderTransform>
<RotateTransform Angle="180"></RotateTransform>
</Path.RenderTransform>
</Path>
</Viewbox>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#FFB800"></Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Background" Value="#22CB64"></Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="Gray"></Setter>
<Setter Property="Background" Value="Black"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<!--上一页-->
<Button x:Name="btnPrePage" Style="{StaticResource PrevPage}" Click="btnPrePage_Click" CommandParameter="{Binding}"
VerticalAlignment="Center" Visibility="{Binding NumVisible}"> </Button>
<!--页码-->
<ItemsControl x:Name="itemsControl">
<ItemsControl.Template>
<ControlTemplate>
<ItemsPresenter></ItemsPresenter>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Button x:Name="btnNum" Height="28" Background="Transparent" Click="btnNum_Click"
CommandParameter="{Binding}" VerticalAlignment="Center" Visibility="{Binding NumVisible}">
<Button.Template>
<ControlTemplate>
<Border x:Name="border" Background="Transparent" CornerRadius="2" SnapsToDevicePixels="True">
<TextBlock x:Name="txt" Margin="10 0 10 0" Foreground="{Binding CurrentPageColor}"
FontSize="{Binding FontSize}" FontWeight="Bold" Text="{Binding Page}" VerticalAlignment="Center" ></TextBlock>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="border" Property="Background" Value="#6633ccee"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
<Border Height="28" Visibility="{Binding OmitVisible}">
<TextBlock x:Name="txt" Margin="10 0 10 3" Foreground="Black" FontSize="{Binding FontSize}" Text="…" VerticalAlignment="Center" ></TextBlock>
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!--下一页-->
<Button x:Name="btnNextPage" Style="{StaticResource NextPage}" Click="btnNextPage_Click" CommandParameter="{Binding}" VerticalAlignment="Center" Visibility="{Binding NumVisible}"> </Button>
</StackPanel>
</Grid>
</UserControl>

后台逻辑

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media; namespace SwitchModule.Controls
{
/// <summary>
/// 分页控件
/// </summary>
public partial class Pager : UserControl, INotifyPropertyChanged
{
#region 事件
/// <summary>
/// 分页事件
/// </summary>
public event EventHandler<PageChangedEventArgs> PageChanged;
#endregion #region 变量
private ObservableCollection<PageControlItemModel> _collection = new ObservableCollection<PageControlItemModel>();
private List<PageControlItemModel> _list = null;
#endregion #region 属性
private int _FontSize = ;
/// <summary>
/// 文字字体大小
/// </summary>
public new int FontSize
{
get { return _FontSize; }
set
{
_FontSize = value;
OnPropertyChanged("FontSize"); CalcPageNumList(); //计算页码
}
}
#endregion #region 分页相关属性
///// <summary>
///// 总页数
///// </summary>
public static readonly DependencyProperty PageCountProperty = DependencyProperty.Register(
"PageCount", typeof(int), typeof(Pager), new PropertyMetadata()); public int PageCount
{
get { return (int)GetValue(PageCountProperty); }
set { SetValue(PageCountProperty, value); }
} ///// <summary>
///// 当前页码
///// </summary>
public static readonly DependencyProperty PageProperty = DependencyProperty.Register(
"Page", typeof(int), typeof(Pager), new PropertyMetadata()); public int Page
{
get { return (int)GetValue(PageProperty); }
set { SetValue(PageProperty, value); }
} ///// <summary>
///// 记录总数
///// </summary>
public static readonly DependencyProperty RecordCountProperty = DependencyProperty.Register(
"RecordCount", typeof(int), typeof(Pager), new PropertyMetadata()); public int RecordCount
{
get { return (int)GetValue(RecordCountProperty); }
set { SetValue(RecordCountProperty, value); }
} ///// <summary>
///// 每页记录数
///// </summary>
public static readonly DependencyProperty PageSizeProperty = DependencyProperty.Register(
"PageSize", typeof(int), typeof(Pager), new PropertyMetadata()); public int PageSize
{
get { return (int)GetValue(PageSizeProperty); }
set { SetValue(PageSizeProperty, value); }
} private int _ContinuousCount = ;
/// <summary>
/// 当前页码右边连续页码数
/// </summary>
public int ContinuousCount
{
get { return _ContinuousCount; }
set
{
_ContinuousCount = value;
OnPropertyChanged("_ContinuousCount"); CalcPageNumList(); //计算页码
}
}
#endregion #region 构造函数
public Pager()
{
InitializeComponent(); this.itemsControl.ItemsSource = _collection;
}
#endregion #region 单击页码事件
private void btnNum_Click(object sender, RoutedEventArgs e)
{
if (PageChanged != null)
{
Button btn = sender as Button;
PageControlItemModel itemModel = btn.CommandParameter as PageControlItemModel;
if (itemModel.Page != Page)
{
Page = itemModel.Page;
CalcPageNumList(); PageChangedEventArgs args = new PageChangedEventArgs(itemModel.Page);
PageChanged(sender, args);
}
}
}
#endregion #region 计算页码
/// <summary>
/// 计算页码
/// </summary>
private void CalcPageNumList()
{
PageCount = (RecordCount - ) / PageSize + ; //计算总页数PageCount _list = new List<PageControlItemModel>(); //第一页
PageControlItemModel item = new PageControlItemModel(, Page);
_list.Add(item); int itemCnt = ; int _page = ; itemCnt = ContinuousCount + Page > PageCount ? PageCount : ContinuousCount + Page;
if (ContinuousCount + Page > PageCount)
{
_page = PageCount - ContinuousCount>0? PageCount - ContinuousCount:1;
}
else
{
_page = Page;
}
for (int i = _page; i < itemCnt; i++)
{ item = new PageControlItemModel(i, Page);
if (!_list.Exists(a => a.Page == item.Page))
{
_list.Add(item);
}
} //最后一页
item = new PageControlItemModel(PageCount, Page);
if (!_list.Exists(a => a.Page == item.Page))
{
_list.Add(item);
} for (int i = _list.Count - ; i > ; i--)
{
if (_list[i].Page - _list[i - ].Page > )
{
_list.Insert(i, new PageControlItemModel(, Page, ));
}
} //上一页下一页
if (Page == )
{
this.btnPrePage.IsEnabled = false; }
else
{
this.btnPrePage.IsEnabled = true; }
if (Page == PageCount)
{
this.btnNextPage.IsEnabled = false; }
else
{
this.btnNextPage.IsEnabled = true; } _collection.Clear();
_list.ForEach(a => { _collection.Add(a); });
}
#endregion #region 上一页
private void btnPrePage_Click(object sender, RoutedEventArgs e)
{
int prePage = Page - ;
if (prePage < ) prePage = ;
if (prePage != Page)
{
Page = prePage;
CalcPageNumList(); PageChangedEventArgs args = new PageChangedEventArgs(prePage);
PageChanged(sender, args);
}
}
#endregion #region 下一页
private void btnNextPage_Click(object sender, RoutedEventArgs e)
{
int nextPage = Page + ;
if (nextPage > PageCount) nextPage = PageCount;
if (nextPage != Page)
{ Page = nextPage;
CalcPageNumList(); PageChangedEventArgs args = new PageChangedEventArgs(nextPage);
PageChanged(sender, args);
}
}
#endregion #region INotifyPropertyChanged接口
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
} protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == PageSizeProperty)
{
CalcPageNumList();
}
else if (e.Property == RecordCountProperty)
{
CalcPageNumList();
}
} #endregion } #region 分页控件Item Model
/// <summary>
/// 分页控件Item Model
/// </summary>
public class PageControlItemModel : INotifyPropertyChanged
{
private int _Type = ;
/// <summary>
/// 类型(1数字 2省略号)
/// </summary>
public int Type
{
get { return _Type; }
set
{
_Type = value;
OnPropertyChanged("Type"); if (_Type == )
{
NumVisible = Visibility.Visible;
OmitVisible = Visibility.Collapsed;
}
else
{
NumVisible = Visibility.Collapsed;
OmitVisible = Visibility.Visible;
}
}
} private bool _IsCurrentPage;
/// <summary>
/// 是否当前页码
/// </summary>
public bool IsCurrentPage
{
get { return _IsCurrentPage; }
set
{
_IsCurrentPage = value;
OnPropertyChanged("IsCurrentPage"); if (_IsCurrentPage)
{
CurrentPageColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#22CB64"));
}
else
{
CurrentPageColor = new SolidColorBrush(Colors.Black);
}
}
} private SolidColorBrush _CurrentPageColor = new SolidColorBrush(Colors.Green);
/// <summary>
/// 当前页码颜色
/// </summary>
public SolidColorBrush CurrentPageColor
{
get { return _CurrentPageColor; }
set
{
_CurrentPageColor = value;
OnPropertyChanged("CurrentPageColor");
}
} private int _Page;
/// <summary>
/// 页码
/// </summary>
public int Page
{
get { return _Page; }
set
{
_Page = value;
OnPropertyChanged("Page");
}
} private Visibility _NumVisible = Visibility.Visible;
/// <summary>
/// 数字可见
/// </summary>
public Visibility NumVisible
{
get { return _NumVisible; }
set
{
_NumVisible = value;
OnPropertyChanged("NumVisible");
}
} private Visibility _OmitVisible = Visibility.Collapsed;
/// <summary>
/// 省略号可见
/// </summary>
public Visibility OmitVisible
{
get { return _OmitVisible; }
set
{
_OmitVisible = value;
OnPropertyChanged("OmitVisible");
}
} /// <summary>
/// 分页控件Item Model
/// </summary>
/// <param name="page">页码</param>
/// <param name="currentPage">当前页码</param>
/// <param name="type">类型(1数字 2省略号)</param>
public PageControlItemModel(int page, int currentPage, int type = )
{
Type = type;
Page = page;
IsCurrentPage = page == currentPage;
} #region INotifyPropertyChanged接口
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion }
#endregion #region 分页事件参数
/// <summary>
/// 分页事件参数
/// </summary>
public class PageChangedEventArgs : EventArgs
{
private int _Page = ;
/// <summary>
/// 当前页码
/// </summary>
public int Page
{
get
{
return _Page;
}
} /// <summary>
/// 分页事件参数
/// </summary>
/// <param name="page">当前页码</param>
public PageChangedEventArgs(int page)
{
_Page = page;
}
}
#endregion }

WPF 分页控件Pager的更多相关文章

  1. WPF 分页控件 WPF 多线程 BackgroundWorker

    WPF 分页控件 WPF 多线程 BackgroundWorker 大家好,好久没有发表一篇像样的博客了,最近的开发实在头疼,很多东西无从下口,需求没完没了,更要命的是公司的开发从来不走正规流程啊, ...

  2. 两款不同应用场景的Wpf分页控件

    简介 今天给大家分享两个Wpf分页控件,本篇博客主要介绍一些实现思路和使用方法,具体实现和应用代码请参考文末的Demo链接 废话不多说,先看一下效果~ (两款控件显示效果是一样的) 实现思路 一款控件 ...

  3. WPF 分页控件的实现 -用户控件

    效果图:

  4. 自定义WPF分页控件

    一.分页控件功能说明 实现如上图所示的分页控件,需要实现一下几个功能: 可以设置每页能够展示的最大列数(例如每页8列.每页16列等等). 加载的数组总数量超过设置的每页列数后,需分页展示. 可以直接点 ...

  5. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  6. 基于avalon+jquery做的bootstrap分页控件

    刚开始学习avalon,项目需要就尝试写了个分页控件Pager.js:基于BootStrap样式这个大家都很熟悉 在这里推荐下国产前端神器avalon:确实好用,帮我解决了很多前端问题. 不多说了,代 ...

  7. WPF 实现 DataGrid/ListView 分页控件

    在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟 ...

  8. 基于WPF系统框架设计(10)-分页控件设计

    背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...

  9. wpf打印控件 实现分页打印控件功能

    因为 要实现打印 wpf  listbox控件  数据特别多 要打印在 几张纸上    找了几天 都没有找到相关的例子 现在 解决了 在这里和大家分享一下 public void print(Fram ...

随机推荐

  1. 全球首个百万IOPS云盘即将商业化 阿里云推出超高性能云盘ESSD

    近日,在经过近半年的上线公测后,阿里云全球首个跨入IOPS百万时代的云盘——ESSD即将迎来商业化,单盘IOPS高达100万,这是阿里云迄今为止性能最强的企业级块存储服务. 搭配ECS云服务器使用, ...

  2. codechef Heavy-light Decompositions

    Heavy-light Decompositions Problem Code: HLDOTSSubmit All submissions for this problem are available ...

  3. Notepad++中Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level

    使用Notepad++编辑python代码运行遇到了这个问题: IndentationError: unindent does not match any outer indentation leve ...

  4. 如何mock https请求

    最近在测试项目过程当中,遇到客户端mock https请求的场景,但是默认用charles抓取出来的https请求是乱码的,对于这类请求如何来mock,有以下2种方式: 1.这里有篇http://co ...

  5. s3c6410时钟初始化

        今天自己写bootloader做时钟初始化时遇到的问题,特记录下来.为了方便理解,我大部分都有截图, 在此我先说明下,图均来自数据手冊.也希望看了本篇文章的同志多多參看数据手冊才干理解的更加透 ...

  6. iOS编译错误#ld: warning: ignoring file# 之 Undefined symbols for architecture x86_64 - ld: symbol(s) not found for architecture x86_64

    ld: warning: ignoring file xxxPath/libbaidumapapi.a, missing required architecture x86_64 in file xx ...

  7. @CSP模拟2019.10.16 - T3@ 垃圾分类

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个 ...

  8. WebSocket 实时更新mysql数据到页面

    使用websocket的初衷是,要实时更新mysql中的报警信息到web页面显示 没怎么碰过web,代码写的是真烂,不过也算是功能实现了,放在这里也是鞭策自己,web也要多下些功夫 准备 引入依赖 & ...

  9. Collections.sort list内部排序

    public class ComparatorUser implements Comparator{   public int compare(Object arg0, Object arg1) {  ...

  10. oracle函数 COALESCE(c1, c2, ...,cn)

    [功能]返回列表中第一个非空的表达式,如果所有表达式都为空值则返回1个空值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null [返回]同参数类型 [说明]从Orac ...