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 AIRS.usercontrol { /// /// 分页控件 /// public partial class PageNumControl: UserControl, INotifyPropertyChanged { #region 事件 /// /// 分页事件 /// public event EventHandler PageChanged; #endregion #region 变量 private ObservableCollection _collection = new ObservableCollection(); private List _list = null; #endregion #region 属性 private int _FontSize = 36; /// /// 文字字体大小 /// public int FontSize { get { return _FontSize; } set { _FontSize = value; OnPropertyChanged("FontSize"); CalcPageNumList(); //计算页码 } } #endregion #region 分页相关属性 private int _PageCount = 1; /// /// 总页数 /// public int PageCount { get { return _PageCount; } set { _PageCount = value; OnPropertyChanged("PageCount"); } } private int _Page = 1; /// /// 当前页码 /// public int Page { get { return _Page; } set { _Page = value; OnPropertyChanged("Page"); CalcPageNumList(); //计算页码 } } private int _RecordCount = 0; /// /// 记录总数 /// public int RecordCount { get { return _RecordCount; } set { _RecordCount = value; OnPropertyChanged("RecordCount"); CalcPageNumList(); //计算页码 } } private int _PageSize = 10; /// /// 每页记录数 /// public int PageSize { get { return _PageSize; } set { _PageSize = value; OnPropertyChanged("PageSize"); CalcPageNumList(); //计算页码 } } private int _ContinuousCount = 3; /// /// 当前页码右边连续页码数 /// public int ContinuousCount { get { return _ContinuousCount; } set { _ContinuousCount = value; OnPropertyChanged("_ContinuousCount"); CalcPageNumList(); //计算页码 } } #endregion #region 构造函数 public PageNumControl() { InitializeComponent(); } #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 计算页码 /// /// 计算页码 /// private void CalcPageNumList() { PageCount = (RecordCount - 1) / PageSize + 1; //计算总页数PageCount _list = new List(); //第一页 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); }); this.itemsControl.ItemsSource = _collection; } #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 /// /// 分页控件Item Model /// public class PageControlItemModel : INotifyPropertyChanged { private int _Type = 1; /// /// 类型(1数字 2省略号) /// 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; /// /// 是否当前页码 /// 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); /// /// 当前页码颜色 /// public SolidColorBrush CurrentPageColor { get { return _CurrentPageColor; } set { _CurrentPageColor = value; OnPropertyChanged("CurrentPageColor"); } } private int _Page; /// /// 页码 /// public int Page { get { return _Page; } set { _Page = value; OnPropertyChanged("Page"); } } private Visibility _NumVisible = Visibility.Visible; /// /// 数字可见 /// public Visibility NumVisible { get { return _NumVisible; } set { _NumVisible = value; OnPropertyChanged("NumVisible"); } } private Visibility _OmitVisible = Visibility.Collapsed; /// /// 省略号可见 /// public Visibility OmitVisible { get { return _OmitVisible; } set { _OmitVisible = value; OnPropertyChanged("OmitVisible"); } } /// /// 分页控件Item Model /// /// 页码 /// 当前页码 /// 类型(1数字 2省略号) 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 分页事件参数 /// /// 分页事件参数 /// public class PageChangedEventArgs : EventArgs { private int _Page = 1; /// /// 当前页码 /// public int Page { get { return _Page; } } /// /// 分页事件参数 /// /// 当前页码 public PageChangedEventArgs(int page) { _Page = page; } } #endregion }