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,一经查实,立即删除!

相关文章

高并发下防止库存超卖解决方案

一、概述 目前网上关于防止库存超卖&#xff0c;我没找到可以支持一次购买多件的&#xff0c;都是基于一次只能购买一件做的秒杀方案&#xff0c;但是实际场景中&#xff0c;一般秒杀活动都是支持&#xff11;&#xff5e;&#xff15;件的&#xff0c;因此为了补缺&#xff0…

【几何/分治】【最短路】【数学期望】Day 10.24

1、斜率 可以证明如果两点之间还有一点的话那么原来的两个点连线一定不会是最大斜率 然后我就写了个沙茶分治………… 其实根据上面的推论只用枚举相邻的两个点&#xff0c;扫一遍就可以了 1 #include <cstdio>2 #include <algorithm>3 #include <iostream>4…

K8s 介绍

过去一段时间&#xff0c;公司事情比较多&#xff0c;现在稍微能好点&#xff0c;今天进一步验证自己K8S 集群环境&#xff0c;遇到不少问题&#xff0c; 发现从自己的master 上无法访问node 的pod&#xff0c; 然后一堆search 。 config 。。 [rootk8s-master ~]# systemctl s…

easypoi needmerge失效_EasyPOI简单用例,简单有效

用poi导出Excel表格&#xff0c;需要配置很多东西&#xff0c;也比较麻烦&#xff0c;这里使用poi的封装easypoi&#xff0c;可以快速配置&#xff0c;实现Excel或者word文件的导出。这里我们结合SpringMVC开发easypoi。1&#xff0c;导入以下3个.jar包:这里是springMVC和easyp…

禁止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 文件夹的共享目录。 我们最终想…

jsp编程技术徐天凤课后答案_jsp编程技术教材课后习题.doc

jsp编程技术教材课后习题JSP编程技术习题集1.6 本 章 习 题思考题(1)为什么要为JDK设置环境变量&#xff1f;(2)Tomcat和JDK是什么关系&#xff1f;(3)什么是Web服务根目录、子目录、相对目录&#xff1f;如何配置虚拟目录&#xff1f;(4)什么是B/S模式&#xff1f;(5)JSP、Jav…

JVM知识(一)

java三大流&#xff1a;数据流、控制流、指令流 线程是执行程序的最小单元&#xff0c;一个线程中也有这些东西。 java 运行时数据区&#xff1a; 1.程序计数器 指向当前线程正在执行的字节码指令地址。如果此时从一个线程转为执行另一个线程&#xff0c;此时就会中断&#xff…

AWD-LSTM为什么这么棒?

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

Spread / Rest 操作符

Spread / Rest 操作符指的是 ...&#xff0c;具体是 Spread 还是 Rest 需要看上下文语境。 当被用于迭代器中时&#xff0c;它是一个 Spread 操作符&#xff1a;&#xff08;参数为数组&#xff09; function foo(x,y,z) {console.log(x,y,z); }let arr [1,2,3]; foo(...arr);…

python postman脚本自动化_如何用Postman做接口自动化测试

什么是自动化测试把人对软件的测试行为转化为由机器执行测试行为的一种实践。例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用例还必…

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

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

朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后&#xff0c;回过头来去看23种设计模式你会发现很多平时写代码的套路和OO的套路和设计模式里总结的类似&#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元素提供修复浏览器…

FPGA浮点数定点化

因为在普通的fpga芯片里面&#xff0c;寄存器只可以表示无符号型&#xff0c;不可以表示小数&#xff0c;所以在计算比较精确的数值时&#xff0c;就需要做一些处理&#xff0c;不过在altera在Arria 10 中增加了硬核浮点DSP模块&#xff0c;这样更加适合硬件加速和做一些比较精…

框架实现修改功能的原理_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…

自己使用的一个.NET轻量开发结构

三个文件夹&#xff0c;第一个是放置前端部分&#xff0c;第二个是各种支持的类文件&#xff0c;第三个是单元测试文件。Core文件类库放置的是与数据库做交互的文件&#xff0c;以及一些第三方类库&#xff0c;还有与数据库连接的文件1.Lasy.Validator是一个基于Attribute验证器…

英语影视台词---八、the shawshank redemption

英语影视台词---八、the shawshank redemption 一、总结 一句话总结&#xff1a;肖申克的救赎 1、Its funny. On the outside, I was an honest man. Straight as an arrow. I had to come to prison to be a crook.&#xff1f; 这很有趣。 在外面&#xff0c;我是一个诚实的人…