WPF實(shí)現(xiàn)列表分頁(yè)控件的示例代碼
WPF 之列表分頁(yè)控件
框架使用大于等于.NET40
。
Visual Studio 2022
。
項(xiàng)目使用 MIT 開(kāi)源許可協(xié)議。
新建Pagination
自定義控件繼承自Control
。
正常模式分頁(yè) 在外部套Grid
分為0 - 5
列:
Grid.Column 0
總頁(yè)數(shù)共多少300
條。Grid.Column 1
輸入每頁(yè)顯示多少10
條。Grid.Column 2 上一頁(yè)
按鈕。Grid.Column 3 所有頁(yè)碼
按鈕此處使用ListBox
。Grid.Column 4 下一頁(yè)
按鈕。Grid.Column 5
跳轉(zhuǎn)頁(yè)1
碼輸入框。
精簡(jiǎn)模式分頁(yè) 在外部套Grid
分為0 - 9
列:
Grid.Column 0
總頁(yè)數(shù)共多少300
條。Grid.Column 2
輸入每頁(yè)顯示多少10
條。Grid.Column 3 條 / 頁(yè)
。Grid.Column 5 上一頁(yè)
按鈕。Grid.Column 7
跳轉(zhuǎn)頁(yè)1
碼輸入框。Grid.Column 9 下一頁(yè)
按鈕。
每頁(yè)顯示與跳轉(zhuǎn)頁(yè)碼數(shù)控制只允許輸入數(shù)字,不允許粘貼。
實(shí)現(xiàn)代碼
<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"/>
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?Override ????????public?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?Command ????????private?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?Properties ????????private?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; ????????????else ????????????????ctrl.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> ????????///?????分頁(yè) ????????///?</summary> ????????private?void?OnCountPerPageTextBoxChanged(object?sender,?TextChangedEventArgs?e) ????????{ ????????????if?(int.TryParse(_countPerPageTextBox.Text,?out?var?_ountPerPage)) ????????????????CountPerPage?=?_ountPerPage; ????????} ????????///?<summary> ????????///?????跳轉(zhuǎn)頁(yè) ????????///?</summary> ????????private?void?OnJumpPageTextBoxChanged(object?sender,?TextChangedEventArgs?e) ????????{ ????????????if?(int.TryParse(_jumpPageTextBox.Text,?out?var?_current)) ????????????????Current?=?_current; ????????} ????????///?<summary> ????????///?????選擇頁(yè) ????????///?</summary> ????????private?void?OnSelectionChanged(object?sender,?SelectionChangedEventArgs?e) ????????{ ????????????if?(_listBox.SelectedItem?==?null) ????????????????return; ????????????Current?=?int.Parse(_listBox.SelectedItem.ToString()); ????????} ????????#endregion ????????#region?Private ????????private?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="?條?/?頁(yè)"?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="每頁(yè)?"?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="?頁(yè)"?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) 創(chuàng)建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="正常模式分頁(yè)"?HorizontalAlignment="Center"?VerticalAlignment="Center"/> ????????<TextBlock?Grid.Column="2"?Text="精簡(jiǎn)模式分頁(yè)"?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; ????????} ????} }
實(shí)現(xiàn)效果
以上就是WPF實(shí)現(xiàn)列表分頁(yè)控件的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于WPF列表分頁(yè)控件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)文件上傳與下載功能實(shí)例
本篇文章主要介紹了C#實(shí)現(xiàn)文件上傳與下載,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2016-12-12通過(guò)LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法
這篇文章主要介紹了通過(guò)LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法,大家參考使用吧2013-11-11C#網(wǎng)站生成靜態(tài)頁(yè)面的實(shí)例講解
今天小編就為大家分享一篇關(guān)于C#網(wǎng)站生成靜態(tài)頁(yè)面的實(shí)例講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01C# windows語(yǔ)音識(shí)別與朗讀實(shí)例
這篇文章主要為大家詳細(xì)介紹了C# windows語(yǔ)音識(shí)別與朗讀實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Unity圖形學(xué)之ShaderLab入門基礎(chǔ)
Unity中所有Shader文件都通過(guò)一種陳述性語(yǔ)言進(jìn)行描述,稱為“ShaderLab”, 這篇文章主要介紹了Unity圖形學(xué)之ShaderLab入門基礎(chǔ),需要的朋友可以參考下2022-01-01winform實(shí)現(xiàn)可拖動(dòng)的自定義Label控件
這篇文章主要為大家詳細(xì)介紹了winform實(shí)現(xiàn)可拖動(dòng)的自定義Label控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03