WPF 之列表分页控件

 WPF 之列表分页控件

控件名:WindowAcrylicBlur

作者: WPFDevelopersOrg  - 黄佳 | 驚鏵

原文链接:    https://github.com/WPFDevelopersOrg/WPFDevelopers

  • 框架使用大于等于.NET40

  • Visual Studio 2022

  • 项目使用 MIT 开源许可协议。

  • 新建Pagination自定义控件继承自Control

  • 正常模式分页 在外部套Grid分为0 - 5列:

    • Grid.Column 0 总页数共多少300条。

    • Grid.Column 1 输入每页显示多少10条。

    • Grid.Column 2 上一页按钮。

    • Grid.Column 3 所有页码按钮此处使用ListBox

    • Grid.Column 4 下一页按钮。

    • Grid.Column 5 跳转页1码输入框。

  • 精简模式分页 在外部套Grid分为0 - 9列:

    • Grid.Column 0 总页数共多少300条。

    • Grid.Column 2 输入每页显示多少10条。

    • Grid.Column 3 条 / 页

    • Grid.Column 5 上一页按钮。

    • Grid.Column 7 跳转页1码输入框。

    • Grid.Column 9 下一页按钮。

  • 每页显示跳转页码数控制只允许输入数字,不允许粘贴。

<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="Auto"/>
3b34fc95b3c66557bdc40002d18fa92e.png

1) Pagination.cs 如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using WPFDevelopers.Helpers;namespace WPFDevelopers.Controls
{[TemplatePart(Name = CountPerPageTextBoxTemplateName, Type = typeof(TextBox))][TemplatePart(Name = JustPageTextBoxTemplateName, Type = typeof(TextBox))][TemplatePart(Name = ListBoxTemplateName, Type = typeof(ListBox))]public class Pagination : Control{private const string CountPerPageTextBoxTemplateName = "PART_CountPerPageTextBox";private const string JustPageTextBoxTemplateName = "PART_JumpPageTextBox";private const string ListBoxTemplateName = "PART_ListBox";private const string Ellipsis = "···";private static readonly Type _typeofSelf = typeof(Pagination);private TextBox _countPerPageTextBox;private TextBox _jumpPageTextBox;private ListBox _listBox;static Pagination(){InitializeCommands();DefaultStyleKeyProperty.OverrideMetadata(_typeofSelf, new FrameworkPropertyMetadata(_typeofSelf));}#region Overridepublic override void OnApplyTemplate(){base.OnApplyTemplate();UnsubscribeEvents();_countPerPageTextBox = GetTemplateChild(CountPerPageTextBoxTemplateName) as TextBox;if (_countPerPageTextBox != null){_countPerPageTextBox.ContextMenu = null;_countPerPageTextBox.PreviewTextInput += _countPerPageTextBox_PreviewTextInput;_countPerPageTextBox.PreviewKeyDown += _countPerPageTextBox_PreviewKeyDown;}_jumpPageTextBox = GetTemplateChild(JustPageTextBoxTemplateName) as TextBox;if (_jumpPageTextBox != null){_jumpPageTextBox.ContextMenu = null;_jumpPageTextBox.PreviewTextInput += _countPerPageTextBox_PreviewTextInput;_jumpPageTextBox.PreviewKeyDown += _countPerPageTextBox_PreviewKeyDown;}_listBox = GetTemplateChild(ListBoxTemplateName) as ListBox;Init();SubscribeEvents();}private void _countPerPageTextBox_PreviewKeyDown(object sender, KeyEventArgs e){if (Key.Space == e.Key||Key.V == e.Key&& e.KeyboardDevice.Modifiers == ModifierKeys.Control)e.Handled = true;}private void _countPerPageTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e){e.Handled = ControlsHelper.IsNumber(e.Text);}#endregion#region Commandprivate static void InitializeCommands(){PrevCommand = new RoutedCommand("Prev", _typeofSelf);NextCommand = new RoutedCommand("Next", _typeofSelf);CommandManager.RegisterClassCommandBinding(_typeofSelf,new CommandBinding(PrevCommand, OnPrevCommand, OnCanPrevCommand));CommandManager.RegisterClassCommandBinding(_typeofSelf,new CommandBinding(NextCommand, OnNextCommand, OnCanNextCommand));}public static RoutedCommand PrevCommand { get; private set; }public static RoutedCommand NextCommand { get; private set; }private static void OnPrevCommand(object sender, RoutedEventArgs e){var ctrl = sender as Pagination;ctrl.Current--;}private static void OnCanPrevCommand(object sender, CanExecuteRoutedEventArgs e){var ctrl = sender as Pagination;e.CanExecute = ctrl.Current > 1;}private static void OnNextCommand(object sender, RoutedEventArgs e){var ctrl = sender as Pagination;ctrl.Current++;}private static void OnCanNextCommand(object sender, CanExecuteRoutedEventArgs e){var ctrl = sender as Pagination;e.CanExecute = ctrl.Current < ctrl.PageCount;}#endregion#region Propertiesprivate static readonly DependencyPropertyKey PagesPropertyKey =DependencyProperty.RegisterReadOnly("Pages", typeof(IEnumerable<string>), _typeofSelf,new PropertyMetadata(null));public static readonly DependencyProperty PagesProperty = PagesPropertyKey.DependencyProperty;public IEnumerable<string> Pages => (IEnumerable<string>) GetValue(PagesProperty);private static readonly DependencyPropertyKey PageCountPropertyKey =DependencyProperty.RegisterReadOnly("PageCount", typeof(int), _typeofSelf,new PropertyMetadata(1, OnPageCountPropertyChanged));public static readonly DependencyProperty PageCountProperty = PageCountPropertyKey.DependencyProperty;public int PageCount => (int) GetValue(PageCountProperty);private static void OnPageCountPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var ctrl = d as Pagination;var pageCount = (int) e.NewValue;/*if (ctrl._jumpPageTextBox != null)ctrl._jumpPageTextBox.Maximum = pageCount;*/}public static readonly DependencyProperty IsLiteProperty =DependencyProperty.Register("IsLite", typeof(bool), _typeofSelf, new PropertyMetadata(false));public bool IsLite{get => (bool) GetValue(IsLiteProperty);set => SetValue(IsLiteProperty, value);}public static readonly DependencyProperty CountProperty = DependencyProperty.Register("Count", typeof(int),_typeofSelf, new PropertyMetadata(0, OnCountPropertyChanged, CoerceCount));public int Count{get => (int) GetValue(CountProperty);set => SetValue(CountProperty, value);}private static object CoerceCount(DependencyObject d, object value){var count = (int) value;return Math.Max(count, 0);}private static void OnCountPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var ctrl = d as Pagination;var count = (int) e.NewValue;ctrl.SetValue(PageCountPropertyKey, (int) Math.Ceiling(count * 1.0 / ctrl.CountPerPage));ctrl.UpdatePages();}public static readonly DependencyProperty CountPerPageProperty = DependencyProperty.Register("CountPerPage",typeof(int), _typeofSelf, new PropertyMetadata(50, OnCountPerPagePropertyChanged, CoerceCountPerPage));public int CountPerPage{get => (int) GetValue(CountPerPageProperty);set => SetValue(CountPerPageProperty, value);}private static object CoerceCountPerPage(DependencyObject d, object value){var countPerPage = (int) value;return Math.Max(countPerPage, 1);}private static void OnCountPerPagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var ctrl = d as Pagination;var countPerPage = (int) e.NewValue;if (ctrl._countPerPageTextBox != null)ctrl._countPerPageTextBox.Text = countPerPage.ToString();ctrl.SetValue(PageCountPropertyKey, (int) Math.Ceiling(ctrl.Count * 1.0 / countPerPage));if (ctrl.Current != 1)ctrl.Current = 1;elsectrl.UpdatePages();}public static readonly DependencyProperty CurrentProperty = DependencyProperty.Register("Current", typeof(int),_typeofSelf, new PropertyMetadata(1, OnCurrentPropertyChanged, CoerceCurrent));public int Current{get => (int) GetValue(CurrentProperty);set => SetValue(CurrentProperty, value);}private static object CoerceCurrent(DependencyObject d, object value){var current = (int) value;var ctrl = d as Pagination;return Math.Max(current, 1);}private static void OnCurrentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var ctrl = d as Pagination;var current = (int) e.NewValue;if (ctrl._listBox != null)ctrl._listBox.SelectedItem = current.ToString();if (ctrl._jumpPageTextBox != null)ctrl._jumpPageTextBox.Text = current.ToString();ctrl.UpdatePages();}#endregion#region Event/// <summary>///     分页/// </summary>private void OnCountPerPageTextBoxChanged(object sender, TextChangedEventArgs e){if (int.TryParse(_countPerPageTextBox.Text, out var _ountPerPage))CountPerPage = _ountPerPage;}/// <summary>///     跳转页/// </summary>private void OnJumpPageTextBoxChanged(object sender, TextChangedEventArgs e){if (int.TryParse(_jumpPageTextBox.Text, out var _current))Current = _current;}/// <summary>///     选择页/// </summary>private void OnSelectionChanged(object sender, SelectionChangedEventArgs e){if (_listBox.SelectedItem == null)return;Current = int.Parse(_listBox.SelectedItem.ToString());}#endregion#region Privateprivate void Init(){SetValue(PageCountPropertyKey, (int) Math.Ceiling(Count * 1.0 / CountPerPage));_jumpPageTextBox.Text = Current.ToString();//_jumpPageTextBox.Maximum = PageCount;_countPerPageTextBox.Text = CountPerPage.ToString();if (_listBox != null)_listBox.SelectedItem = Current.ToString();}private void UnsubscribeEvents(){if (_countPerPageTextBox != null)_countPerPageTextBox.TextChanged -= OnCountPerPageTextBoxChanged;if (_jumpPageTextBox != null)_jumpPageTextBox.TextChanged -= OnJumpPageTextBoxChanged;if (_listBox != null)_listBox.SelectionChanged -= OnSelectionChanged;}private void SubscribeEvents(){if (_countPerPageTextBox != null)_countPerPageTextBox.TextChanged += OnCountPerPageTextBoxChanged;if (_jumpPageTextBox != null)_jumpPageTextBox.TextChanged += OnJumpPageTextBoxChanged;if (_listBox != null)_listBox.SelectionChanged += OnSelectionChanged;}private void UpdatePages(){SetValue(PagesPropertyKey, GetPagers(Count, Current));if (_listBox != null && _listBox.SelectedItem == null)_listBox.SelectedItem = Current.ToString();}private IEnumerable<string> GetPagers(int count, int current){if (count == 0)return null;if (PageCount <= 7)return Enumerable.Range(1, PageCount).Select(p => p.ToString()).ToArray();if (current <= 4)return new[] {"1", "2", "3", "4", "5", Ellipsis, PageCount.ToString()};if (current >= PageCount - 3)return new[]{"1", Ellipsis, (PageCount - 4).ToString(), (PageCount - 3).ToString(), (PageCount - 2).ToString(),(PageCount - 1).ToString(), PageCount.ToString()};return new[]{"1", Ellipsis, (current - 1).ToString(), current.ToString(), (current + 1).ToString(), Ellipsis,PageCount.ToString()};}#endregion}
}

2) Pagination.xaml 如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"xmlns:helpers="clr-namespace:WPFDevelopers.Helpers"xmlns:controls="clr-namespace:WPFDevelopers.Controls"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/></ResourceDictionary.MergedDictionaries><Style x:Key="PageListBoxStyleKey" TargetType="{x:Type ListBox}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderThickness" Value="0"/><Setter Property="Padding" Value="0"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ListBox}"><Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"><ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}"><ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/></ScrollViewer></Border><ControlTemplate.Triggers><Trigger Property="IsGrouping" Value="True"><Setter Property="ScrollViewer.CanContentScroll" Value="False"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="PageListBoxItemStyleKey" TargetType="{x:Type ListBoxItem}"BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="MinWidth" Value="32"/><Setter Property="Cursor" Value="Hand"/><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="VerticalContentAlignment" Value="Center"/><Setter Property="helpers:ElementHelper.CornerRadius" Value="3"/><Setter Property="BorderThickness" Value="1"/><Setter Property="Padding" Value="5,0"/><Setter Property="Margin" Value="3,0"/><Setter Property="Background" Value="{DynamicResource BackgroundSolidColorBrush}"/><Setter Property="BorderBrush" Value="{DynamicResource BaseSolidColorBrush}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ListBoxItem}"><Border SnapsToDevicePixels="True"Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}"  Padding="{TemplateBinding Padding}"CornerRadius="{Binding Path=(helpers:ElementHelper.CornerRadius),RelativeSource={RelativeSource TemplatedParent}}"><ContentPresenter x:Name="PART_ContentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"RecognizesAccessKey="True" TextElement.Foreground="{TemplateBinding Foreground}"/></Border></ControlTemplate></Setter.Value></Setter><Style.Triggers><DataTrigger Binding="{Binding .}" Value="···"><Setter Property="IsEnabled" Value="False"/><Setter Property="FontWeight" Value="Bold"/></DataTrigger><Trigger Property="IsMouseOver" Value="True"><Setter Property="BorderBrush" Value="{DynamicResource DefaultBorderBrushSolidColorBrush}"/><Setter Property="Background" Value="{DynamicResource DefaultBackgroundSolidColorBrush}"/><Setter Property="Foreground" Value="{DynamicResource PrimaryNormalSolidColorBrush}"/></Trigger><Trigger Property="IsSelected" Value="True"><Setter Property="Background" Value="{DynamicResource PrimaryPressedSolidColorBrush}"/><Setter Property="TextElement.Foreground" Value="{DynamicResource WindowForegroundColorBrush}"/></Trigger></Style.Triggers></Style><ControlTemplate x:Key="LitePagerControlTemplate" TargetType="{x:Type controls:Pagination}"><Border Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"Padding="{TemplateBinding Padding}"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="10"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="10"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="5"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="5"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center"Text="{Binding Count,StringFormat=共 {0} 条,RelativeSource={RelativeSource TemplatedParent}}"/><TextBox Grid.Column="2" x:Name="PART_CountPerPageTextBox" TextAlignment="Center" VerticalContentAlignment="Center"Width="60" MinWidth="0"input:InputMethod.IsInputMethodEnabled="False"/><TextBlock Grid.Column="3" Text=" 条 / 页" VerticalAlignment="Center"/><Button Grid.Column="5" Command="{x:Static controls:Pagination.PrevCommand}"><Path Width="7" Height="10" Stretch="Fill" Fill="{Binding Foreground,RelativeSource={RelativeSource AncestorType=Button}}"Data="{StaticResource PathPrevious}"/></Button><TextBox Grid.Column="7" x:Name="PART_JumpPageTextBox" TextAlignment="Center" VerticalContentAlignment="Center"Width="60" MinWidth="0"><TextBox.ToolTip><TextBlock><TextBlock.Text><MultiBinding StringFormat="{}{0}/{1}"><Binding Path="Current" RelativeSource="{RelativeSource TemplatedParent}"/><Binding Path="PageCount" RelativeSource="{RelativeSource TemplatedParent}"/></MultiBinding></TextBlock.Text></TextBlock></TextBox.ToolTip></TextBox><Button Grid.Column="9" Command="{x:Static controls:Pagination.NextCommand}"><Path Width="7" Height="10" Stretch="Fill" Fill="{Binding Foreground,RelativeSource={RelativeSource AncestorType=Button}}"Data="{StaticResource PathNext}"/></Button></Grid></Border></ControlTemplate><Style TargetType="{x:Type controls:Pagination}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:Pagination}"><Border Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"Padding="{TemplateBinding Padding}"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><TextBlock Margin="0,0,15,0" VerticalAlignment="Center"Text="{Binding Count,StringFormat=共 {0} 条,RelativeSource={RelativeSource TemplatedParent}}"/><StackPanel Grid.Column="1" Orientation="Horizontal" Margin="0,0,15,0" ><TextBlock Text="每页 " VerticalAlignment="Center"/><TextBox x:Name="PART_CountPerPageTextBox" TextAlignment="Center" Width="60"MinWidth="0" VerticalContentAlignment="Center"FontSize="{TemplateBinding FontSize}" input:InputMethod.IsInputMethodEnabled="False"/><TextBlock Text=" 条" VerticalAlignment="Center"/></StackPanel><Button Grid.Column="2" Command="{x:Static controls:Pagination.PrevCommand}"><Path Width="7" Height="10" Stretch="Fill" Fill="{Binding Foreground,RelativeSource={RelativeSource AncestorType=Button}}"Data="{StaticResource PathPrevious}"/></Button><ListBox x:Name="PART_ListBox" Grid.Column="3"SelectedIndex="0" Margin="5,0"ItemsSource="{TemplateBinding Pages}"Style="{StaticResource PageListBoxStyleKey}"ItemContainerStyle="{StaticResource PageListBoxItemStyleKey}"ScrollViewer.HorizontalScrollBarVisibility="Hidden"ScrollViewer.VerticalScrollBarVisibility="Hidden"><ListBox.ItemsPanel><ItemsPanelTemplate><UniformGrid Rows="1"/></ItemsPanelTemplate></ListBox.ItemsPanel></ListBox><Button Grid.Column="4" Command="{x:Static controls:Pagination.NextCommand}"><Path Width="7" Height="10" Stretch="Fill" Fill="{Binding Foreground,RelativeSource={RelativeSource AncestorType=Button}}"Data="{StaticResource PathNext}"/></Button><StackPanel Grid.Column="5" Orientation="Horizontal"><TextBlock Text=" 前往 " VerticalAlignment="Center"/><TextBox x:Name="PART_JumpPageTextBox"TextAlignment="Center" ContextMenu="{x:Null}"Width="60" VerticalContentAlignment="Center"MinWidth="0"FontSize="{TemplateBinding FontSize}" /><TextBlock Text=" 页" VerticalAlignment="Center"/></StackPanel></Grid></Border></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsLite" Value="true"><Setter Property="Template" Value="{StaticResource LitePagerControlTemplate}"/></Trigger></Style.Triggers></Style></ResourceDictionary>

3) 创建PaginationExampleVM.cs如下:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;namespace WPFDevelopers.Samples.ViewModels
{public class PaginationExampleVM : ViewModelBase{private List<int> _sourceList = new List<int>();public PaginationExampleVM(){_sourceList.AddRange(Enumerable.Range(1, 300));Count = 300;CurrentPageChanged();}public ObservableCollection<int> PaginationCollection { get; set; } = new ObservableCollection<int>();private int _count;public int Count{get { return _count; }set { _count = value;  this.NotifyPropertyChange("Count"); CurrentPageChanged(); }}private int _countPerPage = 10;public int CountPerPage{get { return _countPerPage; }set { _countPerPage = value; this.NotifyPropertyChange("CountPerPage"); CurrentPageChanged(); }}private int _current = 1;public int Current{get { return _current; }set { _current = value; this.NotifyPropertyChange("Current"); CurrentPageChanged(); }}private void CurrentPageChanged(){PaginationCollection.Clear();foreach (var i in _sourceList.Skip((Current - 1) * CountPerPage).Take(CountPerPage)){PaginationCollection.Add(i);}}}
}

4) 使用 PaginationExample.xaml 如下:

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.PaginationExample"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:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UserControl.Resources><Style TargetType="{x:Type TextBlock}"><Setter Property="Foreground" Value="{DynamicResource PrimaryTextSolidColorBrush}" /><Setter Property="FontSize" Value="{StaticResource NormalFontSize}"/><Setter Property="VerticalAlignment" Value="Center"/></Style></UserControl.Resources><Grid><Grid.RowDefinitions><RowDefinition Height="50"/><RowDefinition/><RowDefinition Height="40"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="2*"/><ColumnDefinition Width="30"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><TextBlock Text="正常模式分页" HorizontalAlignment="Center" VerticalAlignment="Center"/><TextBlock Grid.Column="2" Text="精简模式分页" HorizontalAlignment="Center" VerticalAlignment="Center"/><ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding NormalPaginationViewModel.PaginationCollection}" Margin="20,0,0,0"/><ListBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding LitePaginationViewModel.PaginationCollection}" Margin="0,0,20,0"/><wpfdev:Pagination Grid.Row="2" Grid.Column="0" IsLite="False"  Margin="20,0,0,0"Count="{Binding NormalPaginationViewModel.Count,Mode=TwoWay}"CountPerPage="{Binding NormalPaginationViewModel.CountPerPage,Mode=TwoWay}"Current="{Binding NormalPaginationViewModel.Current,Mode=TwoWay}"/><wpfdev:Pagination Grid.Row="2" Grid.Column="2" IsLite="true"  Margin="0,0,20,0"Count="{Binding LitePaginationViewModel.Count,Mode=TwoWay}"CountPerPage="{Binding LitePaginationViewModel.CountPerPage,Mode=TwoWay}"Current="{Binding LitePaginationViewModel.Current,Mode=TwoWay}"/></Grid>
</UserControl>

5) 使用PaginationExample.xaml.cs如下:

using System.Windows.Controls;
using WPFDevelopers.Samples.ViewModels;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// PaginationExample.xaml 的交互逻辑/// </summary>public partial class PaginationExample : UserControl{public PaginationExampleVM NormalPaginationViewModel { get; set; } = new PaginationExampleVM();public PaginationExampleVM LitePaginationViewModel { get; set; } = new PaginationExampleVM();public PaginationExample(){InitializeComponent();this.DataContext = this;}}
}

 鸣谢 - 黄佳

4674f5eab2adf7c3d8fcc2f7fc065302.gif

Github|Pagination[1]
码云|Pagination[2]

参考资料

[1]

Github|PaginationExample: https://github.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/PaginationExample.xaml

[2]

码云|PaginationExample: https://gitee.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/PaginationExample.xaml

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

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

相关文章

禁止sethc.exe运行 防止3389的sethc后门

废话&#xff1a;在土司看到的一篇文章,发私信给那个哥们儿说让不让转载,结果还没回复我就在百度看到相同的文章。他自己也是转载的。这哥们儿ID迟早被ban 文章转载自:http://www.jb51.net/hack/64484.html 点“开始”&#xff0c;在“运行”中敲入gpedit.msc依次展开“用户配置…

Mac 与虚拟机中的linux集群共享文件目录设置

一、环境介绍 本机&#xff1a;Macos Big Sur系统 虚拟机软件&#xff1a;vmware-fusion 虚拟机上虚拟的linux - centos7 系统 二、实现的效果 在mac上创建一个/Users/SH-Server/vm-vagrant目录&#xff0c;作为之后和虚拟机linux系统 /data 文件夹的共享目录。 我们最终想…

AWD-LSTM为什么这么棒?

摘要&#xff1a; AWD-LSTM为什么这么棒&#xff0c;看完你就明白啦&#xff01;AWD-LSTM是目前最优秀的语言模型之一。在众多的顶会论文中&#xff0c;对字级模型的研究都采用了AWD-LSTMs&#xff0c;并且它在字符级模型中的表现也同样出色。 本文回顾了论文——Regularizing …

Mac上,为虚拟机集群上的每台虚拟机设置固定IP

一、环境介绍 本机&#xff1a;macOS系统 虚拟机软件&#xff1a;VMware Fusion 虚拟机上&#xff1a;centos7内核的Linux系统集群 二、为什么要为每台虚拟机设置固定ip 由于每次启动虚拟机&#xff0c;得到的ip可能不一样&#xff0c;这样对远程连接非常不友好&#xff0c…

记一次某制造业ERP系统 CPU打爆事故分析

一&#xff1a;背景 1.讲故事前些天有位朋友微信找到我&#xff0c;说他的程序出现了CPU阶段性爆高&#xff0c;过了一会就下去了&#xff0c;咨询下这个爆高阶段程序内部到底发生了什么&#xff1f;画个图大概是下面这样&#xff0c;你懂的。按经验来说&#xff0c;这种情况一…

PC端和移动APP端CSS样式初始化

CSS样式初始化分为PC端和移动APP端 1.PC端&#xff1a;使用Normalize.css Normalize.css是一种CSS reset的替代方案。 我们创造normalize.css有下面这几个目的&#xff1a; 保护有用的浏览器默认样式而不是完全去掉它们一般化的样式&#xff1a;为大部分HTML元素提供修复浏览器…

框架实现修改功能的原理_JAVA集合框架的特点及实现原理简介

1.集合框架总体架构集合大致分为Set、List、Queue、Map四种体系,其中List,Set,Queue继承自Collection接口&#xff0c;Map为独立接口Set的实现类有:HashSet&#xff0c;LinkedHashSet&#xff0c;TreeSet...List下有ArrayList&#xff0c;Vector&#xff0c;LinkedList...Map下…

NPM报错终极大法

2019独角兽企业重金招聘Python工程师标准>>> 所有的错误基本上都跟node的版本相关 直接删除系统中的node 重新安装 sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 重新安装 $ n lts $ npm install -g npm $ n stable…

10.python网络编程(socket server 实现并发 part 2)

一、基于tcp的socket通信的基本原理分析。基于tcp的socket通信&#xff0c;主要依靠两个循环&#xff0c;分别是连接循环和通信循环。这个前面的文章有写过&#xff0c;在这里就不再重复了。二、socketserver实现多并发的原理分析。1.server类&#xff1a;2.reques类。类继承关…

如何在一小时内更新100篇文章?-Evernote Sync插件介绍

上一篇“手把手教你制作微信小程序&#xff0c;开源、免费、快速搞定”&#xff0c;已经教会你如何快速制作一个小程序&#xff0c;但作为资讯类小程序&#xff0c;内容不可少&#xff0c;并且还需要及时更新。 但是&#xff0c;如果让你复制粘贴&#xff0c;可能还需要上传图片…

iOS无线真机调试

为什么80%的码农都做不了架构师&#xff1f;>>> Xcode从9开始 就支持无线真机调试&#xff0c;那么怎么操作呢&#xff1f; 首先用数据线连接你的设备&#xff0c;接下来Xcode- Window-Devices and Simulators 点开之后看到你的设备 默认情况下Connect via networ…

Mybatis中jdbcType和javaType的对应关系

2019独角兽企业重金招聘Python工程师标准>>> Mybatis中jdbcType和javaType的对应关系 1 JDBC Type Java Type 2 CHAR String 3 VARCHAR String 4 LONGVARCHAR String 5 NUMERIC java.math.…

Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程

前言 我个人觉得在当前 MVC 流行的架构下&#xff0c;要想去了解一个框架&#xff0c;或者是一个基于此架构下的应用程序&#xff0c;最好的入手方式就是先看路由&#xff0c;虽然路由不是 MVC 里的任何一个&#xff0c;但是知道了路由的来龙去脉就知道了整个框架或者是应用的结…

python装饰器执行顺序

2019独角兽企业重金招聘Python工程师标准>>> 1、单个装饰器执行 上来先看代码&#xff1a; import timedef deco(func):functools.wraps(func)def _wrapper():startTime time.time()print "start"func()print "end"endTime time.time()msecs …

99. Recover Binary Search Tree

一、题目 1、审题 2、分析 给出一个二叉查找树&#xff0c;其中有两个元素的位置弄错了&#xff0c;写算法将其恢复。 二、解答 1、思路&#xff1a; 方法一、 通过中序遍历可以确定一棵二叉查找树由小到大的顺序。 所以在此错位的查找树中查找到的节点中有 1 个比后续节点值大…

myeclipse+git pull项目报错

2019独角兽企业重金招聘Python工程师标准>>> 1.在本地工程目录(.git)找到config文件&#xff1b; 2.修改config文件内容为&#xff1a; [core] repositoryformatversion 0 filemode false logallrefupdates true [branch "master"] remote origin m…

如何关掉macbook的开机声音

1、系统偏好设置->声音 2、关掉“启动时播放声音” 这样设置之后&#xff0c;macbook再开机就没有“咚”的那个声音了

oatdata结构详解

段名称 文件内偏移段大小ELF头部0x000000000x00001000oatdata0x000010000x027b8000oatexec0x027b90000x01ed69ecELF尾部0x046900000x00001000OatHeader&#xff1a; 0x00001000 | 6F 61 74 0A 30 33 39 00 77 40 00 B1 03 00 00 00 | 0x00001010 | 01 00 00 00 19 00 00 00 00…

开源 java CMS - FreeCMS2.6 Web页面信息采集

2019独角兽企业重金招聘Python工程师标准>>> java开源论坛系统http://javabbs.javaz.cn 项目地址&#xff1a;http://www.freeteam.cn/ Web页面信息采集 从FreeCMS 2.1开始支持 通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&…