zoukankan      html  css  js  c++  java
  • 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(); }
  • 相关阅读:
    UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)
    UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)
    【Same Tree】cpp
    【Recover Binary Search Tree】cpp
    【Binary Tree Zigzag Level Order Traversal】cpp
    【Binary Tree Level Order Traversal II 】cpp
    【Binary Tree Level Order Traversal】cpp
    【Binary Tree Post order Traversal】cpp
    【Binary Tree Inorder Traversal】cpp
    【Binary Tree Preorder Traversal】cpp
  • 原文地址:https://www.cnblogs.com/SeNaiTes/p/9645266.html
Copyright © 2011-2022 走看看