(八十三)c#Winform自定义控件-导航菜单(扩展)
2019-10-11 11:18
1856 查看
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
// *********************************************************************** // Assembly : HZH_Controls // Created : 2019-10-11 // // *********************************************************************** // <copyright file="UCNavigationMenuExt.cs"> // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com // </copyright> // // 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; using HZH_Controls.Forms; namespace HZH_Controls.Controls { /// <summary> /// Class UCNavigationMenuExt. /// Implements the <see cref="System.Windows.Forms.UserControl" /> /// </summary> /// <seealso cref="System.Windows.Forms.UserControl" /> [DefaultEvent("ClickItemed")] public partial class UCNavigationMenuExt : UserControl { /// <summary> /// Occurs when [click itemed]. /// </summary> [Description("点击节点事件"), Category("自定义")] public event EventHandler ClickItemed; /// <summary> /// The select item /// </summary> private NavigationMenuItemExt selectItem = null; /// <summary> /// Gets the select item. /// </summary> /// <value>The select item.</value> [Description("选中的节点"), Category("自定义")] public NavigationMenuItemExt SelectItem { get { return selectItem; } private set { selectItem = value; } } /// <summary> /// The items /// </summary> NavigationMenuItemExt[] items; /// <summary> /// Gets or sets the items. /// </summary> /// <value>The items.</value> [Description("节点列表"), Category("自定义")] public NavigationMenuItemExt[] Items { get { return items; } set { items = value; ReloadMenu(); } } /// <summary> /// The tip color /// </summary> private Color tipColor = Color.FromArgb(255, 87, 34); /// <summary> /// Gets or sets the color of the tip. /// </summary> /// <value>The color of the tip.</value> [Description("角标颜色"), Category("自定义")] public Color TipColor { get { return tipColor; } set { tipColor = value; } } /// <summary> /// 获取或设置控件的前景色。 /// </summary> /// <value>The color of the fore.</value> /// <PermissionSet> /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> /// </PermissionSet> public override System.Drawing.Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; foreach (Control c in this.Controls) { c.ForeColor = value; } } } /// <summary> /// 获取或设置控件显示的文字的字体。 /// </summary> /// <value>The font.</value> /// <PermissionSet> /// <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> /// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence" /> /// <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /> /// </PermissionSet> public override Font Font { get { return base.Font; } set { base.Font = value; foreach (Control c in this.Controls) { c.Font = value; } } } /// <summary> /// The m LST anchors /// </summary> Dictionary<NavigationMenuItemExt, FrmAnchor> m_lstAnchors = new Dictionary<NavigationMenuItemExt, FrmAnchor>(); /// <summary> /// Initializes a new instance of the <see cref="UCNavigationMenuExt"/> class. /// </summary> public UCNavigationMenuExt() { InitializeComponent(); items = new NavigationMenuItemExt[0]; if (ControlHelper.IsDesignMode()) { items = new NavigationMenuItemExt[4]; for (int i = 0; i < 4; i++) { items[i] = new NavigationMenuItemExt() { Text = "菜单" + (i + 1), AnchorRight = i >= 2 }; } } } /// <summary> /// Reloads the menu. /// </summary> private void ReloadMenu() { try { ControlHelper.FreezeControl(this, true); this.Controls.Clear(); if (items != null && items.Length > 0) { foreach (var item in items) { var menu = (NavigationMenuItemExt)item; Label lbl = new Label(); lbl.AutoSize = false; lbl.TextAlign = ContentAlignment.MiddleCenter; lbl.Width = menu.ItemWidth; lbl.Text = menu.Text; lbl.Font = Font; lbl.ForeColor = ForeColor; lbl.Paint += lbl_Paint; lbl.MouseEnter += lbl_MouseEnter; lbl.Tag = menu; lbl.Click += lbl_Click; if (menu.AnchorRight) { lbl.Dock = DockStyle.Right; } else { lbl.Dock = DockStyle.Left; } this.Controls.Add(lbl); lbl.BringToFront(); } } } finally { ControlHelper.FreezeControl(this, false); } } /// <summary> /// Handles the Click event of the lbl control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> void lbl_Click(object sender, EventArgs e) { Label lbl = sender as Label; if (lbl.Tag != null) { var menu = (NavigationMenuItemExt)lbl.Tag; if (menu.ShowControl == null) { selectItem = menu; while (m_lstAnchors.Count > 0) { try { foreach (var item in m_lstAnchors) { item.Value.Hide(); } } catch { } } if (ClickItemed != null) { ClickItemed(this, e); } } } } /// <summary> /// Handles the MouseEnter event of the lbl control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> void lbl_MouseEnter(object sender, EventArgs e) { Label lbl = sender as Label; var menu = lbl.Tag as NavigationMenuItemExt; foreach (var item in m_lstAnchors) { m_lstAnchors[item.Key].Hide(); } if (menu.ShowControl != null) { if (!m_lstAnchors.ContainsKey(menu)) { m_lstAnchors[menu] = new FrmAnchor(lbl, menu.ShowControl); } m_lstAnchors[menu].Show(); m_lstAnchors[menu].Size = menu.ShowControl.Size; } } /// <summary> /// Handles the Paint event of the lbl control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="PaintEventArgs" /> instance containing the event data.</param> void lbl_Paint(object sender, PaintEventArgs e) { Label lbl = sender as Label; if (lbl.Tag != null) { var menu = (NavigationMenuItemExt)lbl.Tag; e.Graphics.SetGDIHigh(); if (menu.ShowTip) { if (!string.IsNullOrEmpty(menu.TipText)) { var rect = new Rectangle(lbl.Width - 25, lbl.Height / 2 - 10, 20, 20); var path = rect.CreateRoundedRectanglePath(5); e.Graphics.FillPath(new SolidBrush(tipColor), path); 1d51 e.Graphics.DrawString(menu.TipText, new Font("微软雅黑", 8f), new SolidBrush(Color.White), rect, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } else { e.Graphics.FillEllipse(new SolidBrush(tipColor), new Rectangle(lbl.Width - 20, lbl.Height / 2 - 10, 10, 10)); } } if (menu.Icon != null) { e.Graphics.DrawImage(menu.Icon, new Rectangle(1, (lbl.Height - 25) / 2, 25, 25), 0, 0, menu.Icon.Width, menu.Icon.Height, GraphicsUnit.Pixel); } } } } }View Code
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
相关文章推荐
- (七十九)c#Winform自定义控件-导航菜单
- C# WinForm开发系列之如何使用panel控件制作左侧导航菜单
- C# WInform 界面左导航菜单
- C# WinForm 使用FlowLayoutPanel控件做为导航菜单按钮的容器
- C# winform 屏蔽鼠标右键 spreadsheet Gear 屏蔽鼠标右键菜单
- C# WinForm窗口最小化到系统托盘 右键操作菜单
- C# winform ComboBox添加 +DataGridView绑定,右键菜单,内部编辑,内容清空+多个DataTable存入,合并为一个,并统计重复+账号密码校验+获取当前数据库所有表名
- C#WinForm自定义控件自动停靠
- C#实现Winform动态添加菜单的方法
- c#winform treeview根据菜单创建节点
- C# winform 开机自启动时最小化到托盘 单击显示窗体,右击显示菜单
- (四十五)c#Winform自定义控件-水波图表
- [C# WinForm设计]Panel布局及TabControl增加关闭按钮和Treeview导航 源码
- c#实现按用户角色分配菜单的使用权限(WinForm)
- C#实现用树型列表动态显示菜单,Winform 常用的UI设计
- c#+Winform实现自定义的“复制、粘贴”右键快捷菜单,多个控件共享使用一个右键菜单
- C#Winform基础 为datagridview添加右键菜单
- C# winform treeview node添加右键菜单并选中节点
- C# FORM 自定义控件:带弹出(下拉)菜单的TextBox
- c# 扩展方法奇思妙用高级篇六:WinForm 控件选择器