// *********************************************************************** // Assembly : HZH_Controls // Created : 08-15-2019 // // *********************************************************************** // // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com // // // Blog: https://www.cnblogs.com/bfyx // GitHub:https://github.com/kwwwvagaa/NetWinformControl // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git // // If you use this code, please keep this note. // *********************************************************************** 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; namespace HZH_Controls.Controls { /// /// Class UCMenu. /// Implements the /// /// public partial class UCMenu : UserControl { /// /// 选中项事件 /// public event EventHandler SelectedItem; /// /// The m parent item type /// private Type m_parentItemType = typeof(UCMenuParentItem); /// /// 父类节点类型 /// /// The type of the parent item. /// 节点控件没有实现IMenuItem接口 /// 节点控件没有实现IMenuItem接口 public Type ParentItemType { get { return m_parentItemType; } set { if (value == null) return; if (!typeof(IMenuItem).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(Control))) throw new Exception("节点控件没有实现IMenuItem接口"); m_parentItemType = value; } } /// /// The m children item type /// private Type m_childrenItemType = typeof(UCMenuChildrenItem); /// /// 子类节点类型 /// /// The type of the children item. /// 节点控件没有实现IMenuItem接口 /// 节点控件没有实现IMenuItem接口 public Type ChildrenItemType { get { return m_childrenItemType; } set { if (value == null) return; if (!typeof(IMenuItem).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(Control))) throw new Exception("节点控件没有实现IMenuItem接口"); m_childrenItemType = value; } } /// /// The m parent item styles /// private Dictionary m_parentItemStyles; /// /// 父类节点样式设置,key:属性名称,value:属性值 /// /// The parent item styles. public Dictionary ParentItemStyles { get { return m_parentItemStyles; } set { m_parentItemStyles = value; } } /// /// The m children item styles /// private Dictionary m_childrenItemStyles; /// /// 子类节点样式设置,key:属性名称,value:属性值 /// /// The children item styles. public Dictionary ChildrenItemStyles { get { return m_childrenItemStyles; } set { m_childrenItemStyles = value; } } /// /// The m data source /// private List m_dataSource; /// /// 数据源 /// /// The data source. public List DataSource { get { return m_dataSource; } set { m_dataSource = value; ReloadItems(); } } /// /// The m is show first item /// private bool m_isShowFirstItem = true; /// /// 是否自动展开第一个节点 /// /// true if this instance is show first item; otherwise, false. public bool IsShowFirstItem { get { return m_isShowFirstItem; } set { m_isShowFirstItem = value; } } /// /// The m menu style /// private MenuStyle m_menuStyle = MenuStyle.Fill; /// /// 菜单样式 /// /// The menu style. public MenuStyle MenuStyle { get { return m_menuStyle; } set { m_menuStyle = value; } } /// /// The m LST parent items /// private List m_lstParentItems = new List(); /// /// The m select parent item /// private IMenuItem m_selectParentItem = null; /// /// The m select children item /// private IMenuItem m_selectChildrenItem = null; /// /// The m pan children /// private Panel m_panChildren = null; /// /// Reloads the items. /// private void ReloadItems() { try { ControlHelper.FreezeControl(this, true); this.Controls.Clear(); m_lstParentItems.Clear(); if (m_dataSource != null && m_dataSource.Count > 0) { foreach (var parent in m_dataSource) { IMenuItem parentItem = (IMenuItem)Activator.CreateInstance(m_parentItemType); parentItem.DataSource = parent; if (m_parentItemStyles != null) parentItem.SetStyle(m_parentItemStyles); parentItem.SelectedItem += parentItem_SelectedItem; Control c = parentItem as Control; c.Dock = DockStyle.Top; if (parent.Childrens.Count <= 0) { parentItem.SetSelectedStyle(null); } this.Controls.Add(c); this.Controls.SetChildIndex(c, 0); m_lstParentItems.Add(c); } } m_panChildren = new Panel(); if (m_menuStyle == HZH_Controls.Controls.MenuStyle.Fill) { m_panChildren.Dock = DockStyle.Fill; m_panChildren.Height = 0; } else { m_panChildren.Dock = DockStyle.Top; m_panChildren.Height = 0; } m_panChildren.AutoScroll = true; this.Controls.Add(m_panChildren); } finally { ControlHelper.FreezeControl(this, false); } if (m_isShowFirstItem && m_lstParentItems != null && m_lstParentItems.Count > 0) { parentItem_SelectedItem(m_lstParentItems[0], null); } } /// /// Handles the SelectedItem event of the parentItem control. /// /// The source of the event. /// The instance containing the event data. void parentItem_SelectedItem(object sender, EventArgs e) { this.FindForm().ActiveControl = this; IMenuItem item = sender as IMenuItem; bool? blnNull = null; if (m_lstParentItems.Contains(sender as Control)) { if (m_selectParentItem != item) { if (m_selectParentItem != null) { m_selectParentItem.SetSelectedStyle((m_selectParentItem.DataSource == null || m_selectParentItem.DataSource.Childrens == null || m_selectParentItem.DataSource.Childrens.Count <= 0) ? blnNull : false); } m_selectParentItem = item; m_selectParentItem.SetSelectedStyle((m_selectParentItem.DataSource == null || m_selectParentItem.DataSource.Childrens == null || m_selectParentItem.DataSource.Childrens.Count <= 0) ? blnNull : true); SetChildrenControl(m_selectParentItem); } else { m_selectParentItem.SetSelectedStyle((m_selectParentItem.DataSource == null || m_selectParentItem.DataSource.Childrens == null || m_selectParentItem.DataSource.Childrens.Count <= 0) ? blnNull : false); m_selectParentItem = null; SetChildrenControl(m_selectParentItem, false); } } else if (m_panChildren.Controls.Contains(sender as Control)) { if (m_selectChildrenItem != item) { if (m_selectChildrenItem != null) { m_selectChildrenItem.SetSelectedStyle((m_selectParentItem.DataSource == null || m_selectParentItem.DataSource.Childrens == null || m_selectParentItem.DataSource.Childrens.Count <= 0) ? blnNull : false); } m_selectChildrenItem = item; m_selectChildrenItem.SetSelectedStyle((m_selectParentItem.DataSource == null || m_selectParentItem.DataSource.Childrens == null || m_selectParentItem.DataSource.Childrens.Count <= 0) ? blnNull : true); } } if (SelectedItem != null) { SelectedItem(sender, e); } } /// /// Sets the children control. /// /// The menuitem. /// if set to true [BLN children]. private void SetChildrenControl(IMenuItem menuitem, bool blnChildren = true) { try { ControlHelper.FreezeControl(this, true); if (m_menuStyle == HZH_Controls.Controls.MenuStyle.Fill) { if (blnChildren) { Control cMenu = menuitem as Control; int index = m_lstParentItems.IndexOf(cMenu); for (int i = 0; i <= index; i++) { m_lstParentItems[i].Dock = DockStyle.Top; this.Controls.SetChildIndex(m_lstParentItems[i], 1); } for (int i = index + 1; i < m_lstParentItems.Count; i++) { m_lstParentItems[i].Dock = DockStyle.Bottom; this.Controls.SetChildIndex(m_lstParentItems[i], m_lstParentItems.Count); } m_panChildren.Controls.Clear(); int intItemHeigth = 0; foreach (var item in menuitem.DataSource.Childrens) { IMenuItem parentItem = (IMenuItem)Activator.CreateInstance(m_childrenItemType); parentItem.DataSource = item; if (m_childrenItemStyles != null) parentItem.SetStyle(m_childrenItemStyles); parentItem.SelectedItem += parentItem_SelectedItem; Control c = parentItem as Control; if (intItemHeigth == 0) intItemHeigth = c.Height; c.Dock = DockStyle.Top; m_panChildren.Controls.Add(c); m_panChildren.Controls.SetChildIndex(c, 0); } //m_panChildren.MinimumSize = new Size(0, menuitem.DataSource.Childrens.Count * intItemHeigth); } else { m_panChildren.Controls.Clear(); foreach (var item in m_lstParentItems) { item.Dock = DockStyle.Top; this.Controls.SetChildIndex(item, 1); } } } else { if (blnChildren) { Control cMenu = menuitem as Control; int index = m_lstParentItems.IndexOf(cMenu); this.Controls.SetChildIndex(m_panChildren, m_lstParentItems.Count - index - 1); m_panChildren.Controls.Clear(); int intItemHeigth = 0; foreach (var item in menuitem.DataSource.Childrens) { IMenuItem parentItem = (IMenuItem)Activator.CreateInstance(m_childrenItemType); parentItem.DataSource = item; if (m_childrenItemStyles != null) parentItem.SetStyle(m_childrenItemStyles); parentItem.SelectedItem += parentItem_SelectedItem; Control c = parentItem as Control; if (intItemHeigth == 0) intItemHeigth = c.Height; c.Dock = DockStyle.Top; m_panChildren.Controls.Add(c); m_panChildren.Controls.SetChildIndex(c, 0); } m_panChildren.Height = menuitem.DataSource.Childrens.Count * intItemHeigth; } else { m_panChildren.Controls.Clear(); m_panChildren.Height = 0; } } } finally { ControlHelper.FreezeControl(this, false); } } /// /// Initializes a new instance of the class. /// public UCMenu() { InitializeComponent(); } } /// /// Enum MenuStyle /// public enum MenuStyle { /// /// 平铺 /// Fill = 1, /// /// 顶部对齐 /// Top = 2, } }