WPF簡單的分頁控制項實現

来源:https://www.cnblogs.com/s0611163/archive/2019/03/29/10622769.html
-Advertisement-
Play Games

XAML代碼(使用ItemsControl控制項實現): <UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p ...


XAML代碼(使用ItemsControl控制項實現):

<UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageControl"
             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"        
             mc:Ignorable="d" 
             d:DesignHeight="28" d:DesignWidth="450">
    <Grid>
        <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
            <!--上一頁-->
            <Button x:Name="btnPrePage" Height="28" Background="Transparent" Foreground="#fff" Click="btnPrePage_Click" CommandParameter="{Binding}" VerticalAlignment="Center" Visibility="{Binding NumVisible}">
                <Button.Template>
                    <ControlTemplate>
                        <Border x:Name="border" Background="Transparent" CornerRadius="2">
                            <TextBlock x:Name="txt" Margin="10 0 10 1" Foreground="{TemplateBinding Foreground}" FontSize="{Binding FontSize}" FontWeight="Bold" Text="&lt;&lt;" VerticalAlignment="Center"></TextBlock>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="border" Property="Background" Value="#6633ccee"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
            </Button>
            <!--頁碼-->
            <ItemsControl x:Name="itemsControl">
                <ItemsControl.Template>
                    <ControlTemplate>
                        <ItemsPresenter></ItemsPresenter>
                    </ControlTemplate>
                </ItemsControl.Template>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Button x:Name="btnNum" Height="28" Background="Transparent" Click="btnNum_Click" CommandParameter="{Binding}" VerticalAlignment="Center" Visibility="{Binding NumVisible}">
                                <Button.Template>
                                    <ControlTemplate>
                                        <Border x:Name="border" Background="Transparent" CornerRadius="2" SnapsToDevicePixels="True">
                                            <TextBlock x:Name="txt" Margin="10 0 10 0" Foreground="{Binding CurrentPageColor}" FontSize="{Binding FontSize}" FontWeight="Bold" Text="{Binding Page}" VerticalAlignment="Center" ></TextBlock>
                                        </Border>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsMouseOver" Value="true">
                                                <Setter TargetName="border" Property="Background" Value="#6633ccee"></Setter>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                            <Border Height="28" Visibility="{Binding OmitVisible}">
                                <TextBlock x:Name="txt" Margin="10 0 10 3" Foreground="#fff" FontSize="{Binding FontSize}" Text="…" VerticalAlignment="Center" ></TextBlock>
                            </Border>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <!--下一頁-->
            <Button x:Name="btnNextPage" Height="28" Background="Transparent" Foreground="#fff" Click="btnNextPage_Click" CommandParameter="{Binding}" VerticalAlignment="Center" Visibility="{Binding NumVisible}">
                <Button.Template>
                    <ControlTemplate>
                        <Border x:Name="border" Background="Transparent" CornerRadius="2">
                            <TextBlock x:Name="txt" Margin="10 0 10 1" Foreground="{TemplateBinding Foreground}" FontSize="{Binding FontSize}" FontWeight="Bold" Text=">>" VerticalAlignment="Center"></TextBlock>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="border" Property="Background" Value="#6633ccee"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
            </Button>
        </StackPanel>
    </Grid>
</UserControl>
View Code

後臺代碼:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SunCreate.Vipf.Client.UI.CityDoor
{
    /// <summary>
    /// 分頁控制項
    /// </summary>
    public partial class PageControl : UserControl, INotifyPropertyChanged
    {
        #region 事件
        /// <summary>
        /// 分頁事件
        /// </summary>
        public event EventHandler<PageChangedEventArgs> PageChanged;
        #endregion

        #region 變數
        private ObservableCollection<PageControlItemModel> _collection = new ObservableCollection<PageControlItemModel>();
        private List<PageControlItemModel> _list = null;
        #endregion

        #region 屬性
        private int _FontSize = 12;
        /// <summary>
        /// 文字字體大小
        /// </summary>
        public int FontSize
        {
            get { return _FontSize; }
            set
            {
                _FontSize = value;
                OnPropertyChanged("FontSize");

                CalcPageNumList(); //計算頁碼
            }
        }
        #endregion

        #region 分頁相關屬性
        private int _PageCount = 1;
        /// <summary>
        /// 總頁數
        /// </summary>
        public int PageCount
        {
            get { return _PageCount; }
            set
            {
                _PageCount = value;
                OnPropertyChanged("PageCount");
            }
        }

        private int _Page = 1;
        /// <summary>
        /// 當前頁碼
        /// </summary>
        public int Page
        {
            get { return _Page; }
            set
            {
                _Page = value;
                OnPropertyChanged("Page");

                CalcPageNumList(); //計算頁碼
            }
        }

        private int _RecordCount = 0;
        /// <summary>
        /// 記錄總數
        /// </summary>
        public int RecordCount
        {
            get { return _RecordCount; }
            set
            {
                _RecordCount = value;
                OnPropertyChanged("RecordCount");

                CalcPageNumList(); //計算頁碼
            }
        }

        private int _PageSize = 10;
        /// <summary>
        /// 每頁記錄數
        /// </summary>
        public int PageSize
        {
            get { return _PageSize; }
            set
            {
                _PageSize = value;
                OnPropertyChanged("PageSize");

                CalcPageNumList(); //計算頁碼
            }
        }

        private int _ContinuousCount = 3;
        /// <summary>
        /// 當前頁碼右邊連續頁碼數
        /// </summary>
        public int ContinuousCount
        {
            get { return _ContinuousCount; }
            set
            {
                _ContinuousCount = value;
                OnPropertyChanged("_ContinuousCount");

                CalcPageNumList(); //計算頁碼
            }
        }
        #endregion

        #region 構造函數
        public PageControl()
        {
            InitializeComponent();

            this.itemsControl.ItemsSource = _collection;
        }
        #endregion

        #region 單擊頁碼事件
        private void btnNum_Click(object sender, RoutedEventArgs e)
        {
            if (PageChanged != null)
            {
                Button btn = sender as Button;
                PageControlItemModel itemModel = btn.CommandParameter as PageControlItemModel;
                if (itemModel.Page != Page)
                {
                    Page = itemModel.Page;
                    CalcPageNumList();

                    PageChangedEventArgs args = new PageChangedEventArgs(itemModel.Page);
                    PageChanged(sender, args);
                }
            }
        }
        #endregion

        #region 計算頁碼
        /// <summary>
        /// 計算頁碼
        /// </summary>
        private void CalcPageNumList()
        {
            PageCount = (RecordCount - 1) / PageSize + 1; //計算總頁數PageCount

            _list = new List<PageControlItemModel>();

            //第一頁
            PageControlItemModel item = new PageControlItemModel(1, Page);
            _list.Add(item);

            //當前頁碼連續頁碼
            for (int i = Page - ContinuousCount; i <= Page + ContinuousCount; i++)
            {
                if (i > 0 && i < PageCount)
                {
                    item = new PageControlItemModel(i, Page);
                    if (!_list.Exists(a => a.Page == item.Page))
                    {
                        _list.Add(item);
                    }
                }
            }

            //最後一頁
            item = new PageControlItemModel(PageCount, Page);
            if (!_list.Exists(a => a.Page == item.Page))
            {
                _list.Add(item);
            }

            for (int i = _list.Count - 1; i > 0; i--)
            {
                if (_list[i].Page - _list[i - 1].Page > 1)
                {
                    _list.Insert(i, new PageControlItemModel(0, Page, 2));
                }
            }

            //上一頁下一頁
            if (Page == 1)
            {
                this.btnPrePage.IsEnabled = false;
                this.btnPrePage.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#88dddddd"));
            }
            else
            {
                this.btnPrePage.IsEnabled = true;
                this.btnPrePage.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#fff"));
            }
            if (Page == PageCount)
            {
                this.btnNextPage.IsEnabled = false;
                this.btnNextPage.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#88dddddd"));
            }
            else
            {
                this.btnNextPage.IsEnabled = true;
                this.btnNextPage.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#fff"));
            }

            _collection.Clear();
            _list.ForEach(a => { _collection.Add(a); });
        }
        #endregion

        #region 上一頁
        private void btnPrePage_Click(object sender, RoutedEventArgs e)
        {
            int prePage = Page - 1;
            if (prePage < 1) prePage = 1;
            if (prePage != Page)
            {
                Page = prePage;
                CalcPageNumList();

                PageChangedEventArgs args = new PageChangedEventArgs(prePage);
                PageChanged(sender, args);
            }
        }
        #endregion

        #region 下一頁
        private void btnNextPage_Click(object sender, RoutedEventArgs e)
        {
            int nextPage = Page + 1;
            if (nextPage > PageCount) nextPage = PageCount;
            if (nextPage != Page)
            {
                Page = nextPage;
                CalcPageNumList();

                PageChangedEventArgs args = new PageChangedEventArgs(nextPage);
                PageChanged(sender, args);
            }
        }
        #endregion

        #region INotifyPropertyChanged介面
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        #endregion

    }

    #region 分頁控制項Item Model
    /// <summary>
    /// 分頁控制項Item Model
    /// </summary>
    public class PageControlItemModel : INotifyPropertyChanged
    {
        private int _Type = 1;
        /// <summary>
        /// 類型(1數字 2省略號)
        /// </summary>
        public int Type
        {
            get { return _Type; }
            set
            {
                _Type = value;
                OnPropertyChanged("Type");

                if (_Type == 1)
                {
                    NumVisible = Visibility.Visible;
                    OmitVisible = Visibility.Collapsed;
                }
                else
                {
                    NumVisible = Visibility.Collapsed;
                    OmitVisible = Visibility.Visible;
                }
            }
        }

        private bool _IsCurrentPage;
        /// <summary>
        /// 是否當前頁碼
        /// </summary>
        public bool IsCurrentPage
        {
            get { return _IsCurrentPage; }
            set
            {
                _IsCurrentPage = value;
                OnPropertyChanged("IsCurrentPage");

                if (_IsCurrentPage)
                {
                    CurrentPageColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00f0ff"));
                }
                else
                {
                    CurrentPageColor = new SolidColorBrush(Colors.White);
                }
            }
        }

        private SolidColorBrush _CurrentPageColor = new SolidColorBrush(Colors.White);
        /// <summary>
        /// 當前頁碼顏色
        /// </summary>
        public SolidColorBrush CurrentPageColor
        {
            get { return _CurrentPageColor; }
            set
            {
                _CurrentPageColor = value;
                OnPropertyChanged("CurrentPageColor");
            }
        }

        private int _Page;
        /// <summary>
        /// 頁碼
        /// </summary>
        public int Page
        {
            get { return _Page; }
            set
            {
                _Page = value;
                OnPropertyChanged("Page");
            }
        }

        private Visibility _NumVisible = Visibility.Visible;
        /// <summary>
        /// 數字可見
        /// </summary>
        public Visibility NumVisible
        {
            get { return _NumVisible; }
            set
            {
                _NumVisible = value;
                OnPropertyChanged("NumVisible");
            }
        }

        private Visibility _OmitVisible = Visibility.Collapsed;
        /// <summary>
        /// 省略號可見
        /// </summary>
        public Visibility OmitVisible
        {
            get { return _OmitVisible; }
            set
            {
                _OmitVisible = value;
                OnPropertyChanged("OmitVisible");
            }
        }

        /// <summary>
        /// 分頁控制項Item Model
        /// </summary>
        /// <param name="page">頁碼</param>
        /// <param name="currentPage">當前頁碼</param>
        /// <param name="type">類型(1數字 2省略號)</param>
        public PageControlItemModel(int page, int currentPage, int type = 1)
        {
            Type = type;
            Page = page;
            IsCurrentPage = page == currentPage;
        }

        #region INotifyPropertyChanged介面
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        #endregion

    }
    #endregion

    #region 分頁事件參數
    /// <summary>
    /// 分頁事件參數
    /// </summary>
    public class PageChangedEventArgs : EventArgs
    {
        private int _Page = 1;
        /// <summary>
        /// 當前頁碼
        /// </summary>
        public int Page
        {
            get
            {
                return _Page;
            }
        }

        /// <summary>
        /// 分頁事件參數
        /// </summary>
        /// <param name="page">當前頁碼</param>
        public PageChangedEventArgs(int page)
        {
            _Page = page;
        }
    }
    #endregion

}
View Code

效果圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Sqlserver在設置登錄賬戶信息的時候,有個覆選框信息會被預設勾上,即強制實施密碼策略,預設勾選上的還有強制密碼過期。如果勾上了這個強制密碼過期後,則你的賬戶密碼在一定時間登錄後會提示Sqlserver登錄密碼已過期請重新設置密碼,如果是正在運行中的網站的賬戶,則整個網站可能會因為登錄資料庫失敗 ...
  • 在C#的文件相關操作中,往已有的文件中追加相關內容信息也是常有的操作,例如我們在寫網站日誌文件的時候,很多時候是1天的日誌存放在一個txt文件中,此時就涉及到往原有文件中追加寫入文本內容信息,追加文本內容信息主要通過 File.AppendText方法以及 StreamWriter.Write方法來 ...
  • 反射幫助類 using System; using System.Reflection; using System.Data; using System.Drawing; using System.Resources; using System.ComponentModel; using Syste ...
  • 1.使用ItemsControl控制項 <UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati ...
  • 1.使用ImageFormatConvertHelper 2.使用VerifyCodeHelper 3.調用方式 返回Code(驗證碼內容) ...
  • Web.config中連接字元串配置問題解決方法:<ConnectionStrings>中<add>的providerName寫錯正確寫法:providerName="System.Data.SqlClient" model為空,兩種情況1.沒有加上HttpPost請求。2.沒有獲取到值。 遇見這個 ...
  • SQL註入是比較常見的網路攻擊方式之一,它不是利用操作系統的BUG來實現攻擊,而是針對程式員編程時的疏忽,通過SQL語句,實現無帳號登錄,甚至篡改資料庫。 using System; using System.Collections.Generic; using System.Text; using ...
  • 1.Run Designer→Columns→需要設置的列→Columns properties→ColumnsEdit→New→選擇(repositoryItemComboBox1) 2.給下拉框列賦值: List<Person> listP = AgencyManage.Instance.All ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...