zoukankan      html  css  js  c++  java
  • WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件

    做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码改变事件暴露出来,数据的加载在这里就做就行,所以这个分页控件很简单...

    好像也没啥讲的,直接上代码了

    分页控件基本样式

    <Style TargetType="{x:Type local:Pager}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Pager}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <StackPanel Orientation="Horizontal"
                                    VerticalAlignment="Center">
                            <StackPanel.Resources>
                                <Style TargetType="TextBlock">
                                    <Setter Property="VerticalAlignment"
                                            Value="Center"></Setter>
                                </Style>
                            </StackPanel.Resources>
                            <TextBlock Text="共"></TextBlock>
                            <TextBlock x:Name="PART_TotalCount">
                            </TextBlock>
                            <TextBlock Text="行,"></TextBlock>
                            <TextBlock Text="每页"></TextBlock>
                            <TextBlock x:Name="PART_PageSize">
                            </TextBlock>
                            <TextBlock Text="行,"></TextBlock>
                            <TextBlock Text="第">
                            </TextBlock>
                            <TextBlock x:Name="PART_PageIndex"></TextBlock>
                            <TextBlock Text="/"></TextBlock>
                            <TextBlock x:Name="PART_TotalPage"></TextBlock>
                            <TextBlock Text="页"></TextBlock>
                            <Button Margin="10,0,0,0"
                                    Content="首页"
                                    x:Name="PART_FirstPage"></Button>
                            <Button Margin="10,0,0,0"
                                    Content="上一页"
                                    x:Name="PART_PrePage"></Button>
                            <Button Margin="10,0,0,0"
                                    Content="下一页"
                                    x:Name="PART_NextPage"></Button>
                            <Button Margin="10,0,10,0"
                                    Content="尾页"
                                    x:Name="PART_LastPage"></Button>
                            <TextBox Width="50"
                                     x:Name="PART_PageNum"></TextBox>
                            <Button Margin="10,0,0,0"
                                    Content="转到"
                                    x:Name="PART_PageGo"></Button>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    分页控件代码

    [TemplatePart(Name = "PART_TotalCount", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_PageSize", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_PageIndex", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_TotalPage", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_FirstPage", Type = typeof(Button))]
    [TemplatePart(Name = "PART_PrePage", Type = typeof(Button))]
    [TemplatePart(Name = "PART_NextPage", Type = typeof(Button))]
    [TemplatePart(Name = "PART_LastPage", Type = typeof(Button))]
    [TemplatePart(Name = "PART_PageGo", Type = typeof(Button))]
    [TemplatePart(Name = "PART_PageNum", Type = typeof(TextBox))]
    public class Pager : Control
    {
        #region 字段
    
        private TextBlock _txtTotalCount;
        private TextBlock _txtPageSize;
        private TextBlock _txtPageIndex;
        private TextBlock _txtTotalPage;
        private Button _btnFirstPage;
        private Button _btnPrePage;
        private Button _btnNextPage;
        private Button _btnLastPage;
        private Button _btnPageGo;
        private TextBox _txtBoxPageNum;
    
        #endregion
    
        #region 静态构造
        static Pager()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Pager), new FrameworkPropertyMetadata(typeof(Pager)));
        }
        #endregion
    
        #region 依赖属性
    
        #region 总记录数
    
        public int TotalCount
        {
            get
            {
                return (int)GetValue(TotalCountProperty);
            }
            set
            {
                SetValue(TotalCountProperty, value);
            }
        }
    
        // Using a DependencyProperty as the backing store for TotalCount.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TotalCountProperty =
            DependencyProperty.Register("TotalCount", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                (obj, e) =>
                {
                    var pager = obj as Pager;
    
                    if (pager == null) return;
    
                    pager.SetTotalCount((int)e.NewValue);
                }));
    
        #endregion
    
        #region 每页大小
    
        public int PageSize
        {
            get
            {
                return (int)GetValue(PageSizeProperty);
            }
            set
            {
                SetValue(PageSizeProperty, value);
            }
        }
    
        // Using a DependencyProperty as the backing store for PageSize.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PageSizeProperty =
            DependencyProperty.Register("PageSize", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
                (obj, e) =>
                {
                    var pager = obj as Pager;
    
                    if (pager == null) return;
    
                    pager.SetPageSize((int)e.NewValue);
                }));
    
    
    
        #endregion
    
        #region 当前页
    
        public int PageIndex
        {
            get
            {
                return (int)GetValue(PageIndexProperty);
            }
            set
            {
                SetValue(PageIndexProperty, value);
            }
        }
    
        // Using a DependencyProperty as the backing store for PageIndex.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PageIndexProperty =
            DependencyProperty.Register("PageIndex", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
                (obj, e) =>
                {
                    var pager = obj as Pager;
    
                    if (pager == null) return;
    
                    pager.SetPageIndex((int)e.NewValue);
    
                }));
    
    
    
        #endregion
    
        #region 总页数
    
        public int TotalPage
        {
            get
            {
                return (int)GetValue(TotalPageProperty);
            }
            set
            {
                SetValue(TotalPageProperty, value);
            }
        }
    
        // Using a DependencyProperty as the backing store for TotalPage.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TotalPageProperty =
            DependencyProperty.Register("TotalPage", typeof(int), typeof(Pager), new FrameworkPropertyMetadata(0,
                (obj, e) =>
                {
                    var pager = obj as Pager;
    
                    if (pager == null) return;
    
                    pager.SetTotalPage((int)e.NewValue);
                }));
    
        #endregion
    
        #endregion
    
        #region 路由事件
    
        public static readonly RoutedEvent PageChangedEvent = EventManager.RegisterRoutedEvent("PageChanged",
            RoutingStrategy.Bubble, typeof(EventHandler<PageChangedEventArg>), typeof(Pager));
    
        public event EventHandler<PageChangedEventArg> PageChanged
        {
            add
            {
                this.AddHandler(PageChangedEvent, value);
            }
            remove
            {
                this.RemoveHandler(PageChangedEvent, value);
            }
        }
    
        protected virtual void OnPageChanged()
        {
            var pageChangedEventArg = new PageChangedEventArg(PageIndex);
            pageChangedEventArg.RoutedEvent = PageChangedEvent;
            pageChangedEventArg.Source = this;
            this.RaiseEvent(pageChangedEventArg);
        }
    
        #endregion
    
        #region 方法
    
        public void SetTotalPage(int totalPage)
        {
            _txtTotalPage.Text = totalPage.ToString();
        }
    
        public void SetPageIndex(int pageIndex)
        {
            _txtPageIndex.Text = pageIndex.ToString();
        }
    
        public void SetPageSize(int pageSize)
        {
            _txtPageSize.Text = pageSize.ToString();
        }
    
        /// <summary>
        /// 设置总记录数
        /// </summary>
        /// <param name="totalCount"></param>
        public void SetTotalCount(int totalCount)
        {
            _txtTotalCount.Text = totalCount.ToString();
        }
    
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
    
            _txtTotalCount = GetTemplateChild("PART_TotalCount") as TextBlock;
            _txtPageSize = GetTemplateChild("PART_PageSize") as TextBlock;
            _txtPageIndex = GetTemplateChild("PART_PageIndex") as TextBlock;
            _txtTotalPage = GetTemplateChild("PART_TotalPage") as TextBlock;
    
            _btnFirstPage = GetTemplateChild("PART_FirstPage") as Button;
            _btnPrePage = GetTemplateChild("PART_PrePage") as Button;
            _btnNextPage = GetTemplateChild("PART_NextPage") as Button;
            _btnLastPage = GetTemplateChild("PART_LastPage") as Button;
            _btnPageGo = GetTemplateChild("PART_PageGo") as Button;
    
            _btnFirstPage.Click += _btnFirstPage_Click;
            _btnPrePage.Click += _btnPrePage_Click;
            _btnNextPage.Click += _btnNextPage_Click;
            _btnLastPage.Click += _btnLastPage_Click;
            _btnPageGo.Click += _btnPageGo_Click;
    
            _txtBoxPageNum = GetTemplateChild("PART_PageNum") as TextBox;
        }
    
        #endregion
    
        #region 私有方法
        private void _btnPageGo_Click(object sender, RoutedEventArgs e)
        {
            var pageNum = 1;
    
            if (int.TryParse(_txtBoxPageNum.Text, out pageNum))
            {
                if (pageNum >= 1 && pageNum <= TotalPage)
                {
                    PageIndex = pageNum;
    
                    OnPageChanged();
                }
            }
        }
    
        private void _btnLastPage_Click(object sender, RoutedEventArgs e)
        {
            PageIndex = TotalPage;
    
            OnPageChanged();
        }
    
        private void _btnNextPage_Click(object sender, RoutedEventArgs e)
        {
            if (PageIndex < TotalPage)
            {
                PageIndex++;
    
                OnPageChanged();
            }
        }
    
        private void _btnPrePage_Click(object sender, RoutedEventArgs e)
        {
            if (PageIndex > 1)
            {
                PageIndex--;
    
                OnPageChanged();
            }
        }
    
        private void _btnFirstPage_Click(object sender, RoutedEventArgs e)
        {
            PageIndex = 1;
    
            OnPageChanged();
        }
    
        #endregion
    }
    

    事件参数 PageChangedEventArg.cs

    public class PageChangedEventArg : RoutedEventArgs
    {
        public int PageIndex
        {
            get; set;
        }
    
        public PageChangedEventArg(int pageIndex) : base()
        {
            PageIndex = pageIndex;
        }
    }
    

    Demo和源码都在开源中国上

  • 相关阅读:
    C++基础-函数的覆盖和函数重载
    C++基础-public(公有属性),protected(保护属性),private(私有属性)
    C++基础-父类和子类的构造和析构的顺序
    C++基础-类的(有参数)继承
    C++基础-类的(无参数)继承
    C程序之包含头文件
    时间复杂度详细分析
    "分辨率"到底是个什么概念?它和DPI之间是什么关系?
    每天一个Qt类之QWidget
    line1: 1: Syntax error: word unexpected (expecting ")")
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/6608006.html
Copyright © 2011-2022 走看看