using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Metro; using POSV; using POSV.Entity; namespace POSV.Component { [ToolboxItem(true)] public partial class CategoryX : BaseUserControl { /// /// 商品分类控件元素默认宽度 /// public const int CATEGORY_DEFAULT_WIDTH = 100; private List _dataSource; public CategoryX() { InitializeComponent(); this.itemPanel.ResizeItemsToFit = false; this.itemPanel.BackgroundStyle.Class = "MetroTileGroupTitle";//很关键 } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; } protected override void OnResize(EventArgs e) { base.OnResize(e); //计算能显示的列数 this.ItemWidth = CATEGORY_DEFAULT_WIDTH; if (this.ItemWidth + this.ItemSpace != 0) { this.Columns = (this.itemPanel.Width / (this.ItemWidth + this.ItemSpace)); } if (this.Columns != 0) { this.ItemWidth = Convert.ToInt16((this.itemPanel.Width * 1.0 / (this.Columns * 1.0)) - this.ItemSpace); BindDataSource(this._dataSource); } } public event CategoryXEventHandler CategoryXCheckedChanged; protected virtual void OnCategoryXCheckedChanged(CategoryXEventArgs e) { CategoryXCheckedChanged?.Invoke(this, e); } public void BindDataSource(List dataSource) { try { this._dataSource = dataSource; if (dataSource == null) { this._dataSource = new List(); } this.TotalCount = this._dataSource.Count; this.PageSize = this.Columns * this.Rows; //清空历史数据 this.itemPanel.Items.Clear(); var pager = ListPager(this._dataSource); ItemContainer mainContainer = new ItemContainer(); mainContainer.Name = "categoryContainer"; mainContainer.MultiLine = (this.Rows > 1); mainContainer.ItemSpacing = this.ItemSpace; mainContainer.LayoutOrientation = eOrientation.Horizontal; mainContainer.BackgroundStyle.Padding = 0; mainContainer.BackgroundStyle.PaddingLeft = 0; mainContainer.BackgroundStyle.PaddingRight = 0; foreach (ProductType entity in pager) { MetroTileItem item = new MetroTileItem(); item.TileStyle.PaddingLeft = item.TileStyle.PaddingRight = -2; item.EnableMarkup = true; item.OptionGroup = "category"; item.TileStyle.BorderWidth = 1; item.TileStyle.CornerDiameter = 18; item.TileStyle.CornerType = eCornerType.Rounded; item.TileStyle.BackColor = ColorTranslator.FromHtml("#E7EAF1");// Color.White; item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White; item.TileStyle.BorderColor = ColorTranslator.FromHtml("#E7EAF1");//Color.White; item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White; item.TitleTextAlignment = ContentAlignment.MiddleCenter; item.Checked = false; item.CheckBehavior = eMetroTileCheckBehavior.None; //显示大小 item.TileSize = new Size(this.ItemWidth, this.ItemHeight); item.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; item.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; item.TileStyle.TextColor = ColorTranslator.FromHtml("#444444"); //绑定品类名称到Text属性 item.Text = entity.Name; //绑定品类ID到Tag属性 item.Tag = entity; item.MouseDown -= OnCategoryMouseDown; item.MouseDown += OnCategoryMouseDown; mainContainer.SubItems.Add(item); } this.itemPanel.Items.Insert(0, mainContainer); this.itemPanel.Invalidate(); } catch(Exception ex) { LOGGER.Error(ex, "构建商品分类控件内容异常"); } } private void OnCategoryMouseDown(object sender, MouseEventArgs e) { var metro = sender as MetroTileItem; metro.Checked = false; if (metro.Tag == null) return; foreach (BaseItem item in metro.Parent.SubItems) { if (item == metro) continue; var b = item as MetroTileItem; if (b != null && b.OptionGroup == metro.OptionGroup) { //正常情况下的背景颜色 b.TileStyle.BackColor = ColorTranslator.FromHtml("#E7EAF1");//Color.White; b.TileStyle.BackColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White; b.TileStyle.BorderColor = ColorTranslator.FromHtml("#E7EAF1");//Color.White; b.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#E7EAF1");//Color.White; b.TileStyle.TextColor = ColorTranslator.FromHtml("#444444"); } } //选中情况下的背景颜色 metro.TileStyle.BackColor = ColorTranslator.FromHtml("#00C7BA"); metro.TileStyle.BackColor2 = ColorTranslator.FromHtml("#00C7BA"); metro.TileStyle.BorderColor = ColorTranslator.FromHtml("#00C7BA"); metro.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#00C7BA"); metro.TileStyle.TextColor = ColorTranslator.FromHtml("#FFFFFF"); OnCategoryXCheckedChanged(new CategoryXEventArgs((ProductType)metro.Tag)); } /// /// 分页List数据 /// /// /// public List ListPager(List data) { var result = new List(); result.AddRange(data.Skip((this.PageNumber - 1) * this.PageSize).Take(this.PageSize)); return result; } private MetroTileItem _selectedItem = null; public MetroTileItem SelectedItem { get { return this._selectedItem; } private set { this._selectedItem = value; } } /// /// 每页数量 /// public int PageSize { get; private set; } /// /// 总页数 /// public int PageCount => this.PageSize <= 0 ? 0 : ((TotalCount + this.PageSize - 1) / this.PageSize); /// /// 当前页码 /// public int PageNumber { get; set; } = 1; /// /// 总数量 /// public int TotalCount { get; private set; } private int _columns = 1; /// /// 显示的列数 /// public int Columns { get { return _columns; } set { _columns = (value < 0 ? 1 : value); } } private int _rows = 1; /// /// 显示行数 /// public int Rows { get { return _rows; } set { _rows = (value <= 0 ? 1 : value); } } private int _itemHeight = 38; public int ItemHeight { get { return _itemHeight; } set { _itemHeight = value; } } private int _itemWidth = CATEGORY_DEFAULT_WIDTH; public int ItemWidth { get { return _itemWidth; } set { this._itemWidth = value; } } private int _itemSpace = 2; /// /// 控件间距 /// public int ItemSpace { get { return _itemSpace; } set { this._itemSpace = value; } } private void OnPrePageClick(object sender, EventArgs e) { if (this.HasPreviousPage) { this.PageNumber--; BindDataSource(this._dataSource); } } private void OnNextPageClick(object sender, EventArgs e) { if (this.HasNextPage) { this.PageNumber++; BindDataSource(this._dataSource); } } //是否有上一页 public bool HasPreviousPage { get { return PageNumber > 1; } } //是否有下一页 public bool HasNextPage { get { return PageNumber < this.PageCount; } } } public delegate void CategoryXEventHandler(object sender, CategoryXEventArgs e); public class CategoryXEventArgs : EventArgs { public ProductType Data; public CategoryXEventArgs(ProductType data) { this.Data = data; } } }