• WPF 自定义分页控件二


    一:添加自定义分页控件,命名为KDataPagerTwo:

      1 public class KDataPagerTwo : Control, INotifyPropertyChanged
      2     {
      3         static KDataPagerTwo()
      4         {
      5             DefaultStyleKeyProperty.OverrideMetadata(typeof(KDataPagerTwo), new FrameworkPropertyMetadata(typeof(KDataPagerTwo)));
      6         }
      7 
      8         public event PropertyChangedEventHandler PropertyChanged;
      9         protected void OnPropertyChanged(string propertyName)
     10         {
     11             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     12             if (propertyName == "PagerIndex")
     13             {
     14                 if (PagerIndex != 0)
     15                     ChosenNumber();
     16             }
     17             else if (propertyName == "PagerTotal" || propertyName == "PagerSize")
     18                 Refresh();
     19         }
     20 
     21         #region 变量定义
     22        public TextBox txt_Jump;
     23         public TextBlock txt_One;
     24         public TextBlock txt_Two;
     25         public TextBlock txt_Three;
     26         public TextBlock txt_Four;
     27         public TextBlock txt_Five;
     28         public TextBlock txt_Six;
     29         public TextBlock txt_Total;
     30         /// <summary>
     31         /// 首页
     32         /// </summary>
     33         public Image Img_HomePage;
     34         /// <summary>
     35         /// 上一页
     36         /// </summary>
     37         public Image Img_PreviousPage;
     38         /// <summary>
     39         /// 下一页
     40         /// </summary>
     41         public Image Img_NextPage;
     42         /// <summary>
     43         /// 尾页
     44         /// </summary>
     45         public Image Img_TailPage;
     46         /// <summary>
     47         /// 跳转按钮
     48         /// </summary>
     49         public Button btn_Ok;
     50         #endregion
     51 
     52         #region 依赖属性
     53         /// <summary>
     54         /// 页大小
     55         /// </summary>
     56         public int PagerSize
     57         {
     58             get { return (int)GetValue(PagerSizeProperty); }
     59             set { SetValue(PagerSizeProperty, value); OnPropertyChanged("PagerSize"); }
     60         }
     61 
     62         /// <summary>
     63         /// 当前页
     64         /// </summary>
     65         public int PagerIndex
     66         {
     67             get { return (int)GetValue(PagerIndexProperty); }
     68             set { SetValue(PagerIndexProperty, value); OnPropertyChanged("PagerIndex"); }
     69         }
     70 
     71         /// <summary>
     72         /// 总计录数
     73         /// </summary>
     74         public int PagerTotal
     75         {
     76             get { return (int)GetValue(PagerTotalProperty); }
     77             set { SetValue(PagerTotalProperty, value); OnPropertyChanged("PagerTotal"); }
     78         }
     79 
     80         /// <summary>
     81         /// 总页数
     82         /// </summary>
     83         public int PagerCount
     84         {
     85             get { return (int)GetValue(PagerCountProperty); }
     86             set { SetValue(PagerCountProperty, value); OnPropertyChanged("PagerCount"); }
     87         }
     88 
     89         //使用一个依赖属性作为PagerCount的后备存储器。这支持动画、样式、绑定等。
     90         public static readonly DependencyProperty PagerCountProperty =
     91             DependencyProperty.Register("PagerCount", typeof(int), typeof(KDataPagerTwo), new UIPropertyMetadata(15));
     92 
     93         //使用一个可靠的属性作为总的后备存储器。这支持动画、样式、绑定等
     94         public static readonly DependencyProperty PagerTotalProperty =
     95             DependencyProperty.Register("PagerTotal", typeof(int), typeof(KDataPagerTwo), new UIPropertyMetadata(150));
     96 
     97 
     98         //使用一个依赖属性作为PagerIndex的后备存储器。这支持动画、样式、绑定等。
     99         public static readonly DependencyProperty PagerIndexProperty =
    100             DependencyProperty.Register("PagerIndex", typeof(int), typeof(KDataPagerTwo), new UIPropertyMetadata(1));
    101 
    102 
    103         //使用一个依赖属性作为PagerSize的后备存储器。这支持动画、样式、绑定等。
    104         public static readonly DependencyProperty PagerSizeProperty =
    105             DependencyProperty.Register("PagerSize", typeof(int), typeof(KDataPagerTwo), new UIPropertyMetadata(10));
    106         #endregion 依赖属性_end
    107 
    108         public override void OnApplyTemplate()
    109         {
    110             base.OnApplyTemplate();
    111 
    112             Img_HomePage = GetTemplateChild("Img_HomePage") as Image;
    113             Img_PreviousPage = GetTemplateChild("Img_PreviousPage") as Image;
    114             Img_NextPage = GetTemplateChild("Img_NextPage") as Image;
    115             Img_TailPage = GetTemplateChild("Img_TailPage") as Image;
    116             btn_Ok = GetTemplateChild("btn_Ok") as Button;
    117             txt_Jump = GetTemplateChild("txt_Jump") as TextBox;
    118 
    119             txt_One = GetTemplateChild("txt_One") as TextBlock;
    120             txt_Two = GetTemplateChild("txt_Two") as TextBlock;
    121             txt_Three = GetTemplateChild("txt_Three") as TextBlock;
    122             txt_Four = GetTemplateChild("txt_Four") as TextBlock;
    123             txt_Five = GetTemplateChild("txt_Five") as TextBlock;
    124             txt_Six = GetTemplateChild("txt_Six") as TextBlock;
    125             txt_Total = GetTemplateChild("txt_Total") as TextBlock;
    126             // 绑定事件
    127             Img_HomePage.MouseLeftButtonUp += Img_HomePage_MouseLeftButtonUp;
    128             Img_PreviousPage.MouseLeftButtonUp += Img_PreviousPage_MouseLeftButtonUp;
    129             Img_NextPage.MouseLeftButtonUp += Img_NextPage_MouseLeftButtonUp;
    130             Img_TailPage.MouseLeftButtonUp += Img_TailPage_MouseLeftButtonUp;
    131             btn_Ok.Click += Btn_Ok_Click; ;
    132             txt_Jump.TextChanged += Txt_Jump_TextChanged;
    133 
    134             txt_One.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    135             txt_Two.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    136             txt_Three.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    137             txt_Four.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    138             txt_Five.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    139             txt_Six.MouseLeftButtonUp += Txt_MouseLeftButtonUp;
    140             //刷新页数
    141             Refresh();
    142         }
    143 
    144         /// <summary>
    145         /// 点击TextBlock事件
    146         /// </summary>
    147         private void Txt_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    148         {
    149             if ((sender as TextBlock).Text.ToString() != "")
    150                 PagerIndex = int.Parse((sender as TextBlock).Text);
    151         }
    152 
    153         /// <summary>
    154         /// 只能输入数字
    155         /// </summary>
    156         private void Txt_Jump_TextChanged(object sender, TextChangedEventArgs e)
    157         {
    158             //屏蔽中文输入和非法字符粘贴输入
    159             TextBox textBox = sender as TextBox;
    160             TextChange[] change = new TextChange[e.Changes.Count];
    161             e.Changes.CopyTo(change, 0);
    162             int offset = change[0].Offset;
    163             if (change[0].AddedLength > 0)
    164             {
    165                 double num = 0;
    166                 if (!Double.TryParse(textBox.Text, out num))
    167                 {
    168                     textBox.Text = textBox.Text.Remove(offset, change[0].AddedLength);
    169                     textBox.Select(offset, 0);
    170                 }
    171             }
    172         }
    173 
    174         /// <summary>
    175         /// 跳转
    176         /// </summary>
    177         private void Btn_Ok_Click(object sender, RoutedEventArgs e)
    178         {
    179             int txt = int.Parse(txt_Jump.Text.ToString() == "" ? "0" : txt_Jump.Text.ToString());
    180             if (txt > 0 && txt <= PagerCount)
    181                 PagerIndex = txt;
    182         }
    183 
    184         /// <summary>
    185         /// 首页
    186         /// </summary>
    187         private void Img_HomePage_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    188         {
    189             PagerIndex = 1;
    190         }
    191 
    192         /// <summary>
    193         /// 尾页
    194         /// </summary>
    195         private void Img_TailPage_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    196         {
    197             PagerIndex = PagerCount;
    198         }
    199 
    200         /// <summary>
    201         /// 上一页
    202         /// </summary>
    203         private void Img_PreviousPage_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    204         {
    205             if (PagerIndex > 1)
    206                 PagerIndex--;
    207         }
    208 
    209         /// <summary>
    210         /// 下一页
    211         /// </summary>
    212         private void Img_NextPage_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    213         {
    214             if (PagerIndex < PagerCount)
    215                 PagerIndex++;
    216         }
    217 
    218         #region 方法
    219 
    220         /// <summary>
    221         /// 选中数字的样式
    222         /// </summary>
    223         public void ChosenNumber()
    224         {
    225             if (PagerIndex > (PagerCount - 6))
    226             {
    227                 ColorChanged(6 - (PagerCount - PagerIndex)); LatterNumberChanged(PagerCount);
    228             }
    229             else
    230             {
    231                 ColorChanged(1);
    232                 ForeFiveNumberChanged(PagerIndex);
    233                 LatterTwo();
    234             }
    235         }
    236 
    237         SolidColorBrush ScbBlue = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#193A57"));//蓝色
    238         SolidColorBrush ScbRed = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E92F2F"));//红色
    239 
    240         /// <summary>
    241         /// 当前页变为红色
    242         /// </summary>
    243         public void ColorChanged(int GOTO)
    244         {
    245             txt_One.Foreground = ScbBlue;
    246             txt_Two.Foreground = ScbBlue;
    247             txt_Three.Foreground = ScbBlue;
    248             txt_Four.Foreground = ScbBlue;
    249             txt_Five.Foreground = ScbBlue;
    250             txt_Six.Foreground = ScbBlue;
    251             switch (GOTO)
    252             {
    253                 case 1:
    254                     goto GT1;
    255                 case 2:
    256                     goto GT2;
    257                 case 3:
    258                     goto GT3;
    259                 case 4:
    260                     goto GT4;
    261                 case 5:
    262                     goto GT5;
    263                 case 6:
    264                     goto GT6;
    265             }
    266             GT1: txt_One.Foreground = ScbRed;
    267             return;
    268             GT2: txt_Two.Foreground = ScbRed;
    269             return;
    270             GT3: txt_Three.Foreground = ScbRed;
    271             return;
    272             GT4: txt_Four.Foreground = ScbRed;
    273             return;
    274             GT5: txt_Five.Foreground = ScbRed;
    275             return;
    276             GT6: txt_Six.Foreground = ScbRed;
    277         }
    278 
    279         /// <summary>
    280         /// 前四个数字变化
    281         /// </summary>
    282         /// <param name="InitialNumber">开始数字</param>
    283         public void ForeFiveNumberChanged(int InitialNumber)
    284         {
    285             txt_One.Text = InitialNumber.ToString();
    286             txt_Two.Text = (InitialNumber + 1).ToString();
    287             txt_Three.Text = (InitialNumber + 2).ToString();
    288             txt_Four.Text = (InitialNumber + 3).ToString();
    289         }
    290 
    291         /// <summary>
    292         /// 设置后两位数字
    293         /// </summary>
    294         public void LatterTwo()
    295         {
    296             txt_Six.Text = PagerCount.ToString();
    297             if (PagerCount > 6)
    298                 txt_Five.Text = "";
    299             else
    300                 txt_Five.Text = (PagerCount - 1).ToString();
    301         }
    302 
    303         /// <summary>
    304         /// 数字从尾数开始变化
    305         /// </summary>
    306         /// <param name="Mantissa">尾数</param>
    307         public void LatterNumberChanged(int Mantissa)
    308         {
    309             txt_Six.Text = Mantissa.ToString();
    310             txt_Five.Text = (Mantissa - 1).ToString();
    311             txt_Four.Text = (Mantissa - 2).ToString();
    312             txt_Three.Text = (Mantissa - 3).ToString();
    313             txt_Two.Text = (Mantissa - 4).ToString();
    314             txt_One.Text = (Mantissa - 5).ToString();
    315         }
    316 
    317         /// <summary>
    318         /// 设置总页数
    319         /// </summary>
    320         public void SetPagerCount()
    321         {
    322             int pc = PagerTotal / PagerSize;
    323             if (PagerTotal % PagerSize == 0)
    324                 PagerCount = pc;
    325             else
    326                 PagerCount = pc + 1;
    327             if (PagerCount <= 6)
    328                 CollapsedTXT(PagerCount);
    329             txt_Total.Text = PagerTotal.ToString();
    330         }
    331 
    332         /// <summary>
    333         /// 小于6页的隐藏部分控件
    334         /// </summary>
    335         /// <param name="CollapsedStartTXT">从第几个开始</param>
    336         public void CollapsedTXT(int CollapsedStartTXT)
    337         {
    338             switch (CollapsedStartTXT)
    339             {
    340                 case 1:
    341                     goto CST1;
    342                 case 2:
    343                     goto CST2;
    344                 case 3:
    345                     goto CST3;
    346                 case 4:
    347                     goto CST4;
    348                 case 5:
    349                     goto CST5;
    350             }
    351             return;
    352             CST1: txt_Two.Visibility = Visibility.Collapsed;
    353             CST2: txt_Three.Visibility = Visibility.Collapsed;
    354             CST3: txt_Four.Visibility = Visibility.Collapsed;
    355             CST4: txt_Five.Visibility = Visibility.Collapsed;
    356             CST5: txt_Six.Visibility = Visibility.Collapsed;
    357         }
    358 
    359         /// <summary>
    360         /// 刷新
    361         /// </summary>
    362         public void Refresh()
    363         {
    364             SetPagerCount();
    365             ForeFiveNumberChanged(PagerIndex);
    366             ColorChanged(PagerIndex);
    367             LatterTwo();
    368         }
    369         #endregion
    370     }
    View Code

    二:定义资源字典文件,命名为DataPagerTwo:

    说明:local:KImgButton,这个也是一个自定义控件,可以改成Button控件也没有问题

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:BaseControl"
                        >
        <Style TargetType="Image" x:Key="Img_Size" >
            <Setter Property="Width" Value="14"/>
            <Setter Property="Height" Value="14"/>
        </Style>
        <Style TargetType="TextBlock" x:Key="Txt_Root">
            <Setter Property="FontFamily" Value="新宋体"></Setter>
            <Setter Property="FontSize" Value="14"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="Foreground" Value="#193A57"></Setter>
        </Style>
        <Style TargetType="TextBlock" x:Key="Txt_Side" BasedOn="{StaticResource Txt_Root}">
            <Setter Property="Foreground" Value="#193A57"></Setter>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
        <Style TargetType="TextBlock" x:Key="Txt_Margin" BasedOn="{StaticResource Txt_Root}">
            <Setter Property="Margin" Value="4"/>
            <Setter Property="Cursor" Value="Hand"></Setter>
        </Style>
        <Style TargetType="local:KImgButton">
            <Setter Property="IsEnabled" Value="True"></Setter>
            <Setter Property="CornerRadius" Value="2"></Setter>
            <Setter Property="FIconSize" Value="0"></Setter>
        </Style>
        <Style TargetType="{x:Type local:KDataPagerTwo}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:KDataPagerTwo}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="150"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <StackPanel Orientation="Horizontal" Margin="10,0">
                                <TextBlock Style="{StaticResource Txt_Side}" Text="共"></TextBlock>
                                <TextBlock Style="{StaticResource Txt_Side}" Text="0" Margin="5,0"  x:Name="txt_Total"></TextBlock>
                                <TextBlock Style="{StaticResource Txt_Side}" Text="条数据。"></TextBlock>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal" Grid.Column="1" x:Name="Stack_Control" HorizontalAlignment="Right" Margin="10,0">
                                <Image x:Name="Img_HomePage" Source="/BaseControl;component/Images/DataPagerImages/First.png" Margin="5,0" Style="{ StaticResource Img_Size}" Cursor="Hand"/>
                                <Image x:Name="Img_PreviousPage" Source="/BaseControl;component/Images/DataPagerImages/prev.png" Style="{ StaticResource Img_Size}" Cursor="Hand"/>
    
                                <TextBlock  x:Name="txt_One" Text="1" Style="{StaticResource Txt_Margin}"/>
                                <TextBlock  x:Name="txt_Two" Text="2" Style="{StaticResource Txt_Margin}"/>
                                <TextBlock  x:Name="txt_Three" Text="3" Style="{StaticResource Txt_Margin}"/>
                                <TextBlock  x:Name="txt_Four" Text="4" Style="{StaticResource Txt_Margin}"/>
                                <TextBlock  x:Name="txt_Five" Text="●●●" Style="{StaticResource Txt_Margin}"/>
                                <TextBlock  x:Name="txt_Six" Text="10" Style="{StaticResource Txt_Margin}"/>
    
                                <Image x:Name="Img_NextPage" Source="/BaseControl;component/Images/DataPagerImages/Next.png" Style="{ StaticResource Img_Size}" Cursor="Hand"/>
                                <Image x:Name="Img_TailPage" Source="/BaseControl;component/Images/DataPagerImages/Last.png" Margin="5,0,20,0"  Style="{ StaticResource Img_Size}" Cursor="Hand"/>
    
                                <TextBlock Text="到第" Style="{StaticResource Txt_Root}" Margin="-5,5,5,5"></TextBlock>
    
                                <Border Margin="0,5,5,5" Background="#4081D1" BorderBrush="#4081D1" Width="19" Height="19"> 
                                    <TextBox x:Name="txt_Jump" FontFamily="微软雅黑" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" HorizontalAlignment="Center" FontSize="12" Width="17" Height="17" BorderThickness="0"/>
                                </Border>
    
                                <TextBlock Text="页" Style="{StaticResource Txt_Root}" Margin="0,0,20,0"></TextBlock>
    
                                <local:KImgButton x:Name="btn_Ok" FontFamily="新宋体" FontSize="14" Content="跳转" Height="20" Width="50" Background="#4081D1" Margin="-10,0,0,0"/>
                            </StackPanel>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    View Code

    三:在Generic中引用资源字典文件:

        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/BaseControl;component/Themes/DataPagerTwo.xaml" />
        </ResourceDictionary.MergedDictionaries>

    四:将Generic中下面代码删除:

    <Style TargetType="{x:Type local:KDataPagerTwo}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:KDataPagerTwo}">
                        <Border Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    五:现在就可以用了,用法:

    先引用:

    再添加:

     六:后台PropertyChanged事件代码(当前页数发生变化,就可以根据DataPager.PagerIndex传入分页方法):

            /// <summary>
            /// 当某一属性值发生改变事件
            /// </summary>
            private void DataPager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
            {
                //分页方法(根据需要可以写成其他分页方法)
           //DataPager.PagerIndex--当前页,DataPager.PagerSize--每页记录数
    datagrid1.ItemsSource = TL.ToList().Skip((DataPager.PagerIndex - 1) * DataPager.PagerSize).Take(DataPager.PagerSize).ToList(); }
  • 相关阅读:
    《CLR via C#》读书笔记1 之 CLR的执行模型
    C#中的事件和委托
    优分享VR开源啦,优分享VR是基于Google VR开发的一款手机VR视频资源的聚合软件
    安卓端开源移动浏览器开源项目
    Android客户端发布博客
    博客园的IOS客户端“我的博客园”已发布到AppStore
    博客园的IOS客户端图片展示
    ios在tableview里面加subview后在ip4和ip5上显示不一样的问题
    APP开发手记01(app与web的困惑)
    ios开发3.5和4.0寸屏幕自适应中的一点问题
  • 原文地址:https://www.cnblogs.com/SeNaiTes/p/9645266.html
Copyright © 2020-2023  润新知