本文为伪原创原文为 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. [已转移]IE事件流和DOM标准事件流的区别

    该文章已转移到博客:https://cynthia0329.github.io/ 1.执行的顺序不一样 冒泡型事件模型: button->div->body (IE事件流) 捕获型事件模型 ...

  2. Effective C++: 02构造、析构、赋值运算

    05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...

  3. 【NS2】TCL debug (转载)

    1.使用NS2进行模拟,就不可避免的会接触TCL/OTCL和C/C++.两者配合使用.一般设置场景啊,业务流啊,都使用TCL/OTCL来编写脚 本.要进行路由实验模拟的话,同一类的实验,这些脚本基本上 ...

  4. 【转载】 C++ stl string 操作

        总结一下C++中string的操作,来自〈C++ Primer〉第四版. 1. string对象的定义和初始化: 12345678910111213 string s1; //空串string ...

  5. Python基础:13装饰器

    装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的应用有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同 ...

  6. linux 端口映射设置

    iptables -t nat -A PREROUTING -p tcp --dport 新端口 -j REDIRECT --to-ports 旧端口

  7. hdu 3234 Exclusive-OR (并查集)

    Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...

  8. js获取dom节点

    var s= document.getElementById("test");del_ff(s); //清理空格var chils= s.childNodes; //得到s的全部子 ...

  9. 解决Pycharm中SystemError报错

    报错描述- 代码逻辑大致是, 开启线程, 监听kafka生产者push的topic消息.- 问题出现在监听过程中, 线程在接收几条topic之后出现报错, 不再处理数据12报错代码Exception ...

  10. P1113 同颜色询问

    题目描述 现在有一个包含 \(n\) 个元素的数组,它的元素的编号从 \(1\) 到 \(n\) . 每一个元素都有一个初始的颜色 \(C_i\) 以及数值 \(W_i\) . 这个数组支持 \(4\ ...