欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

自定義WPF分頁控件的全過程記錄

 更新時間:2021年05月20日 09:27:28   作者:Dwaynerbing  
接觸WPF也有一段時間了,最近遇到了一個自定義分頁控件的功能,感覺可以分享下面,所以這篇文章主要介紹了自定義WPF分頁控件的相關(guān)資料,需要的朋友可以參考下

一、分頁控件功能說明#

實現(xiàn)如上圖所示的分頁控件,需要實現(xiàn)一下幾個功能:

  1. 可以設(shè)置每頁能夠展示的最大列數(shù)(例如每頁8列、每頁16列等等)。
  2. 加載的數(shù)組總數(shù)量超過設(shè)置的每頁列數(shù)后,需分頁展示。
  3. 可以直接點擊指定的列數(shù)或者上下頁按鈕進行頁面跳轉(zhuǎn)

二、自定義分頁控件使用說明#

為了實現(xiàn)以上功能,主要進行以下工作:

1、添加一個自定義按鈕PagerButton類,聲明一個依賴屬性IsActive,用于記錄當(dāng)前頁面所在頁數(shù)的按鈕,此時該按鈕邊框高亮顯示,具體代碼如下:

 public class PagerButton : Button
    {
        public bool IsActive
        {
            get { return (bool)GetValue(IsActiveProperty); }
            set { SetValue(IsActiveProperty, value); }
        }

        public static readonly DependencyProperty IsActiveProperty =
            DependencyProperty.Register("IsActive", typeof(bool), typeof(PagerButton), new PropertyMetadata(false));

    }

  <Style x:Key="PagerButtonStyle" TargetType="controls:PagerButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:PagerButton">
                    <Border x:Name="b1" CornerRadius="2" Background="{StaticResource Themes}"
                                            BorderThickness="1" BorderBrush="{StaticResource Disabled}"
                                            Width="32" Height="32" Margin="4,0">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="b1" Property="BorderBrush" Value="{StaticResource Accent}"></Setter>
                        </Trigger>
                        <Trigger Property="IsActive" Value="True">
                            <Setter TargetName="b1" Property="BorderBrush" Value="{StaticResource Accent}"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
        </Style.Triggers>
    </Style>

2、添加自定義分頁控件PagerBar類,用于展示分頁按鈕(使用PagerButton類)和實現(xiàn)分頁跳轉(zhuǎn),需要定義當(dāng)前頁面、總頁數(shù)、設(shè)置的每頁最大列數(shù)三個依賴屬性,具體如下:

   public int CurrentPageIndex
        {
            get { return (int)GetValue(CurrentPageIndexProperty); }
            set { SetValue(CurrentPageIndexProperty, value); }
        }
        public int PageSize
        {
            get { return (int)GetValue(PageSizeProperty); }
            set { SetValue(PageSizeProperty, value); }
        }
        public int PageCount
        {
            get { return (int)GetValue(PageCountProperty); }
            set { SetValue(PageCountProperty, value); }
        }

        public static readonly DependencyProperty CurrentPageIndexProperty = DependencyProperty.Register("CurrentPageIndex", typeof(int), typeof(PagerBar), new PropertyMetadata(-1, CurrentPageIndexPropertyChangedCallback));
        public static readonly DependencyProperty PageSizeProperty = DependencyProperty.Register("PageSize", typeof(int), typeof(PagerBar), new PropertyMetadata(10, PageSizePropertyChangedCallback));
        public static readonly DependencyProperty PageCountProperty = DependencyProperty.Register("PageCount", typeof(int), typeof(PagerBar), new PropertyMetadata(-1, PageCountPropertyChangedCallback));

3、添加一個工具類Pager,用于將數(shù)據(jù)按照要求分頁,該工具類聲明當(dāng)前頁數(shù)、總頁數(shù)、設(shè)置的每頁最大列數(shù)三個屬性,具體如下:

  public int PageSize
        {
            get => _pageSize;
            set
            {
                if (value == _pageSize)
                    return;
                _pageSize = value;
                OnPropertyChanged();
                SetPageSize(_pageSize);
            }
        }
        public int PageCount
        {
            get => _pageCount;
            set
            {
                if (value == _pageCount)
                    return;
                _pageCount = value;

                // 最少頁為1頁
                if (_pageCount == 0)
                    _pageCount = 1;
                OnPropertyChanged();
            }
        }
        public int CurPageIndex
        {
            get => _curPageIndex;
            set
            {
                if (value == _curPageIndex)
                    return;
                _curPageIndex = value;
                OnPropertyChanged();
                GotoPageOf(_curPageIndex);
            }
        }

4、將Pager類和PageBar控件進行數(shù)據(jù)綁定。具體操作為:在綁定的ViewModel上聲明一個Pager類,然后將該Pager類的屬性和PagrBar進行一一對應(yīng)綁定。具體代碼如下:

  <controls:PagerBar Grid.Row="1" Margin="5"
                           HorizontalAlignment="Center"
                           PageSize="{Binding Path=Pager.PageSize, Mode=TwoWay}" 
                           PageCount="{Binding Path=Pager.PageCount, Mode=TwoWay}"  
                           CurrentPageIndex="{Binding Path=Pager.CurPageIndex, Mode=TwoWay}"></controls:PagerBar>

5、初始化Pager類時,在界面綁定的ViewModel里面重新聲明一個數(shù)組,用于保存分頁后的數(shù)組,將該數(shù)組綁定到待展示的條目控件(例如ListBox)上,具體如下:

 StudentCollection=new ObservableCollection<Student>();
            for (int i = 0; i < 10; i++)
            {
                StudentCollection.Add(new Student()
                {
                    Id = Index = i,
                    Source = 10 * (i + 1),
                });
            }

            AddCommand =new RelayCommand(ExecuteAddCommand);
            DeleteCommand=new RelayCommand(ExecuteDeleteCommand);
            SortCommand=new RelayCommand(ExecuteSortCommand);

            Pager=new Pager<Student>(8,StudentCollection);
            Pager.PagerUpdated += items =>
            {
                StudentCollectionPaging = new ObservableCollection<Student>(items);
            };
            Pager.CurPageIndex = 1;
  <ListBox x:Name="ListBoxStudent" Grid.Row="0"
                 ItemsSource="{Binding StudentCollectionPaging}"
                 ItemTemplate="{StaticResource StudentDateTemplate}"></ListBox>

三、總結(jié)說明#

​ 為了實現(xiàn)綁定的數(shù)組添加、刪除時,PageBar分組控件也能立即更新控件,Pager工具類增加以下構(gòu)造函數(shù),首先保證數(shù)組為同一引用,其次使用ObservableCollection保證界面和ViewModel即時更新:

    public Pager(int pageSize, ObservableCollection<T> source)
        {
            _pageSize = pageSize;
            _itemsSource = source;
            _itemsSource.CollectionChanged += ItemsSourceOnCollectionChanged;
            CalculatePaging();
        }

        private void ItemsSourceOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            CalculatePaging();
            GotoPageOf(CurPageIndex);
        }

四、示例源碼#

示例源碼地址:分頁控件源碼

五、問題#

​ 在實際應(yīng)用中,發(fā)現(xiàn)如下問題:當(dāng)需要對綁定的整個數(shù)組進行排序時,由于Pager類初始化傳入的數(shù)組必須和實際數(shù)為同一個引用且必須為ObservableCollection數(shù)組,那么使用LINQ排序完成后,必須要使用ToList進行轉(zhuǎn)換,就必須重新初始化ObservableCollection,那么后續(xù)當(dāng)該ObservableCollection數(shù)組變化時,也無法通知到Pager類的數(shù)組了。為了解決該問題,想到以下兩個方法:

(1)自定義排序,針對ObservableCollection的每個數(shù)組對象進行排序。這樣排序完成后ObservableCollection引用無變化。

(2)先用臨時變量保存排序完成的數(shù)組,然后清空ObservableCollection,然后再迭代添加臨時數(shù)組。如此,ObservableCollection對象前后也為統(tǒng)一引用。

  public ICommand SortCommand { get; set; }

        private void ExecuteSortCommand(object obj)
        {
            var list = StudentCollection.ToList().OrderByDescending(item=>item.Source).ToList();
            StudentCollection.Clear();
            foreach (var item in list)
            {
                StudentCollection.Add(item);
            }
        }

目前暫時采用了第二種方法,但該方法效率不高。后續(xù)有更好的解決方法可以留言討論。

總結(jié)

到此這篇關(guān)于自定義WPF分頁控件的文章就介紹到這了,更多相關(guān)自定義WPF分頁控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用C#打印九九乘法表

    如何利用C#打印九九乘法表

    這篇文章主要給大家介紹了關(guān)于如何利用C#打印九九乘法表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C#使用非托管代碼直接修改字符串的方法

    C#使用非托管代碼直接修改字符串的方法

    在string方法中,如ToUpper等字符串操作方法,都會產(chǎn)生一個新的字符串,這樣增大了運行開支。一個替代方案是通過非托管代碼直接操作字符串。如替代ToUpper方法:
    2013-07-07
  • c#調(diào)用winrar解壓縮文件代碼分享

    c#調(diào)用winrar解壓縮文件代碼分享

    這篇文章主要介紹了c#調(diào)用winrar解壓縮文件的方法,大家參考使用吧
    2013-12-12
  • 利用C#編寫掃雷游戲(附源碼)

    利用C#編寫掃雷游戲(附源碼)

    掃雷游戲相信不用給大家過多介紹,大家基本都玩過,下面這篇文章主要給大家介紹了關(guān)于如何利用C#編寫掃雷游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2019-01-01
  • C#?基于TCP?實現(xiàn)掃描指定ip端口的方式示例

    C#?基于TCP?實現(xiàn)掃描指定ip端口的方式示例

    本文主要介紹了C#基于TCP實現(xiàn)掃描指定ip端口的方式示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C# salt+hash 加密

    C# salt+hash 加密

    本文主要介紹了C# salt+hash加密規(guī)則、C# salt產(chǎn)生偽隨機數(shù)原理、hash原理、使用hash來加密的原因等等。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 快速解決C# android base-64 字符數(shù)組的無效長度問題

    快速解決C# android base-64 字符數(shù)組的無效長度問題

    下面小編就為大家?guī)硪黄焖俳鉀QC# android base-64 字符數(shù)組的無效長度問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 基于反射解決類復(fù)制的實現(xiàn)方法

    基于反射解決類復(fù)制的實現(xiàn)方法

    本篇文章對反射解決類復(fù)制的實現(xiàn)方法進行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C# 建造者模式(Builder Pattern)詳細(xì)講解

    C# 建造者模式(Builder Pattern)詳細(xì)講解

    建造者模式是一種創(chuàng)建型設(shè)計模式,通過將復(fù)雜對象的構(gòu)建過程與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示,它適用于構(gòu)建過程復(fù)雜且涉及多個步驟的場景,本文介紹C# 建造者模式(Builder Pattern)詳細(xì)講解,感興趣的朋友一起看看吧
    2025-03-03
  • WPF實現(xiàn)背景燈光隨鼠標(biāo)閃動效果

    WPF實現(xiàn)背景燈光隨鼠標(biāo)閃動效果

    這篇文章主要為大家詳細(xì)介紹了WPF實現(xiàn)背景燈光隨鼠標(biāo)閃動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論