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; using POSV.Component; using POSV.ThirdPartyOrderData; namespace POSV.WeiXin { [ToolboxItem(true)] public partial class WeixinCategoryX : BaseUserControl { /// /// 商品分类控件元素默认宽度 /// public const int CATEGORY_DEFAULT_WIDTH = 100; private List selectGoodsIdList = new List(); /// /// 选中的品类列表 /// public Dictionary SelectedCategorys { get; set; } private List _dataSource; public WeixinCategoryX() { 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 WeixinCategoryXEventHandler CategoryXCheckedChanged; protected virtual void OnCategoryXCheckedChanged(WeixinCategoryXEventArgs e) { CategoryXCheckedChanged?.Invoke(this, e); } public void BindDataSource(List dataSource) { try { if(this.SelectedCategorys == null) { this.SelectedCategorys = new Dictionary(); } this._dataSource = dataSource; if (this._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 (ListCategory entity in pager) { MetroTileItem item = new MetroTileItem(); item.Name = entity.id; 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"); item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.BorderColor = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.TextColor = ColorTranslator.FromHtml("#444444"); if (this.SelectedCategorys.ContainsKey(entity.id)) { //选中情况下的背景颜色 item.TileStyle.BackColor = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BorderColor = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.TextColor = ColorTranslator.FromHtml("#FFFFFF"); } 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) { if (e.Button == MouseButtons.Left) { MetroTileItem item = (MetroTileItem)sender; var category = item.Tag as ListCategory; //已经被选中,再次点击取消选中 if (this.SelectedCategorys.ContainsKey(category.id)) { //正常情况下的背景颜色 item.TileStyle.BackColor = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.BorderColor = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#E7EAF1"); item.TileStyle.TextColor = ColorTranslator.FromHtml("#444444"); this.SelectedCategorys.Remove(category.id); } else { //选中情况下的背景颜色 item.TileStyle.BackColor = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BackColor2 = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BorderColor = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.BorderColor2 = ColorTranslator.FromHtml("#00C7BA"); item.TileStyle.TextColor = ColorTranslator.FromHtml("#FFFFFF"); this.SelectedCategorys.Add(category.id, category); } OnCategoryXCheckedChanged(new WeixinCategoryXEventArgs(this.SelectedCategorys)); } } /// /// 分页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 WeixinCategoryXEventHandler(object sender, WeixinCategoryXEventArgs e); public class WeixinCategoryXEventArgs : EventArgs { public Dictionary Data; public WeixinCategoryXEventArgs(Dictionary data) { this.Data = data; } } }