本文为伪原创原文为 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. keystone同步数据库的时候提示error

    keystone 在同步的时候报出以下错误: su -s /bin/sh -c "keystone-manage db_sync" keystone CRITICAL keysto ...

  2. 笔记: CC2540 和 CC2541 的区别

    CC2540 和 CC2541 的区别 CC2540 和 CC2541 是 BLE 低功耗蓝牙芯片,使用的是 51 内核. CC2540 有 USB 接口 CC2541 无. 价格上最早是 CC254 ...

  3. Java练习 SDUT-2444_正方形

    正方形 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给出四个点,判断这四个点能否构成一个正方形. Input 输入的 ...

  4. Libevent:3创建event_base

    在使用Libevent函数之前,需要分配一个或多个event_base结构.每一个event_base都持有一个events的集合,并且可以检测那些events是激活的. 如果设置event_base ...

  5. 在window.onload中使用setTimeout

    window.onload = function(){ function n(i){ alert(1); } setTimeout('n(1)',2000); } 以上代码会报错:n() is not ...

  6. LeetCode91 Decode Ways

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  7. SGU 107 987654321 problem【找规律】

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=107 题意: 平方后几位为987654321的n位数有多少个 分析: 虽然说是水题 ...

  8. 解决uploadify插件不同浏览器下的兼容性问题

    http://www.thinkphp.cn/code/2138.html uploadify在部分浏览器上没法使用,或者各种报错的解决方法.uploadify插件上传图片是很爽的体验. 如果用chr ...

  9. LeetCode Weekly Contest 6

    leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解.题目难度不算大,两个easy,一个medium,一个hard.hard题之前接触过,所以做得比较顺利. 1.  Sum of Left ...

  10. DataTable CAST 成集合后,进行自定义排序再转换回DataTable

    dt = dt.Rows.Cast<DataRow>().OrderBy(r => Convert.ToInt32(r["数量"])==0?1:0).ThenBy ...