(八十三)c#Winform自定义控件-导航菜单(扩展)

  • 2019 年 10 月 11 日
  • 筆記

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

来都来了,点个【推荐】再走吧,谢谢

NuGet

Install-Package HZH_Controls

目录

https://www.cnblogs.com/bfyx/p/11364884.html

用处及效果

以上为demo效果,你使用此控件可以实现以下弹出效果

 

 

准备工作

没什么准备的

开始

添加一个类NavigationMenuItemExt 继承NavigationMenuItemBase

1     public class NavigationMenuItemExt : NavigationMenuItemBase  2     {  3         public System.Windows.Forms.Control ShowControl { get; set; }  4     }

添加一个用户控件UCNavigationMenuExt

添加属性

  1 /// <summary>    2         /// Occurs when [click itemed].    3         /// </summary>    4         [Description("点击节点事件"), Category("自定义")]    5    6         public event EventHandler ClickItemed;    7         /// <summary>    8         /// The select item    9         /// </summary>   10         private NavigationMenuItemExt selectItem = null;   11   12         /// <summary>   13         /// Gets the select item.   14         /// </summary>   15         /// <value>The select item.</value>   16         [Description("选中的节点"), Category("自定义")]   17         public NavigationMenuItemExt SelectItem   18         {   19             get { return selectItem; }   20             private set { selectItem = value; }   21         }   22   23         /// <summary>   24         /// The items   25         /// </summary>   26         NavigationMenuItemExt[] items;   27   28         /// <summary>   29         /// Gets or sets the items.   30         /// </summary>   31         /// <value>The items.</value>   32         [Description("节点列表"), Category("自定义")]   33         public NavigationMenuItemExt[] Items   34         {   35             get { return items; }   36             set   37             {   38                 items = value;   39                 ReloadMenu();   40             }   41         }   42         /// <summary>   43         /// The tip color   44         /// </summary>   45         private Color tipColor = Color.FromArgb(255, 87, 34);   46   47         /// <summary>   48         /// Gets or sets the color of the tip.   49         /// </summary>   50         /// <value>The color of the tip.</value>   51         [Description("角标颜色"), Category("自定义")]   52         public Color TipColor   53         {   54             get { return tipColor; }   55             set { tipColor = value; }   56         }   57   58         /// <summary>   59         /// 获取或设置控件的前景色。   60         /// </summary>   61         /// <value>The color of the fore.</value>   62         /// <PermissionSet>   63         ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />   64         /// </PermissionSet>   65         public override System.Drawing.Color ForeColor   66         {   67             get   68             {   69                 return base.ForeColor;   70             }   71             set   72             {   73                 base.ForeColor = value;   74                 foreach (Control c in this.Controls)   75                 {   76                     c.ForeColor = value;   77                 }   78             }   79         }   80         /// <summary>   81         /// 获取或设置控件显示的文字的字体。   82         /// </summary>   83         /// <value>The font.</value>   84         /// <PermissionSet>   85         ///   <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />   86         ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />   87         ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence" />   88         ///   <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />   89         /// </PermissionSet>   90         public override Font Font   91         {   92             get   93             {   94                 return base.Font;   95             }   96             set   97             {   98                 base.Font = value;   99                 foreach (Control c in this.Controls)  100                 {  101                     c.Font = value;  102                 }  103             }  104         }  105  106         /// <summary>  107         /// The m LST anchors  108         /// </summary>  109         Dictionary<NavigationMenuItemExt, FrmAnchor> m_lstAnchors = new Dictionary<NavigationMenuItemExt, FrmAnchor>();

加载和绘图

  1  private void ReloadMenu()    2         {    3             try    4             {    5                 ControlHelper.FreezeControl(this, true);    6                 this.Controls.Clear();    7                 if (items != null && items.Length > 0)    8                 {    9                     foreach (var item in items)   10                     {   11                         var menu = (NavigationMenuItemExt)item;   12                         Label lbl = new Label();   13                         lbl.AutoSize = false;   14                         lbl.TextAlign = ContentAlignment.MiddleCenter;   15                         lbl.Width = menu.ItemWidth;   16                         lbl.Text = menu.Text;   17   18                         lbl.Font = Font;   19                         lbl.ForeColor = ForeColor;   20   21                         lbl.Paint += lbl_Paint;   22                         lbl.MouseEnter += lbl_MouseEnter;   23                         lbl.Tag = menu;   24                         lbl.Click += lbl_Click;   25                         if (menu.AnchorRight)   26                         {   27                             lbl.Dock = DockStyle.Right;   28                         }   29                         else   30                         {   31                             lbl.Dock = DockStyle.Left;   32                         }   33                         this.Controls.Add(lbl);   34   35                         lbl.BringToFront();   36                     }   37   38   39                 }   40             }   41             finally   42             {   43                 ControlHelper.FreezeControl(this, false);   44             }   45         }   46   47         /// <summary>   48         /// Handles the Click event of the lbl control.   49         /// </summary>   50         /// <param name="sender">The source of the event.</param>   51         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>   52         void lbl_Click(object sender, EventArgs e)   53         {   54             Label lbl = sender as Label;   55             if (lbl.Tag != null)   56             {   57                 var menu = (NavigationMenuItemExt)lbl.Tag;   58                 if (menu.ShowControl == null)   59                 {   60                     selectItem = menu;   61   62                     while (m_lstAnchors.Count > 0)   63                     {   64                         try   65                         {   66                             foreach (var item in m_lstAnchors)   67                             {   68                                 item.Value.Hide();   69                             }   70                         }   71                         catch { }   72                     }   73   74                     if (ClickItemed != null)   75                     {   76                         ClickItemed(this, e);   77                     }   78                 }   79             }   80         }   81         /// <summary>   82         /// Handles the MouseEnter event of the lbl control.   83         /// </summary>   84         /// <param name="sender">The source of the event.</param>   85         /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>   86         void lbl_MouseEnter(object sender, EventArgs e)   87         {   88             Label lbl = sender as Label;   89             var menu = lbl.Tag as NavigationMenuItemExt;   90             foreach (var item in m_lstAnchors)   91             {   92                 m_lstAnchors[item.Key].Hide();   93             }   94             if (menu.ShowControl != null)   95             {   96                 if (!m_lstAnchors.ContainsKey(menu))   97                 {   98                     m_lstAnchors[menu] = new FrmAnchor(lbl, menu.ShowControl);   99                 }  100                 m_lstAnchors[menu].Show();  101                 m_lstAnchors[menu].Size = menu.ShowControl.Size;  102             }  103         }  104         /// <summary>  105         /// Handles the Paint event of the lbl control.  106         /// </summary>  107         /// <param name="sender">The source of the event.</param>  108         /// <param name="e">The <see cref="PaintEventArgs" /> instance containing the event data.</param>  109         void lbl_Paint(object sender, PaintEventArgs e)  110         {  111             Label lbl = sender as Label;  112             if (lbl.Tag != null)  113             {  114                 var menu = (NavigationMenuItemExt)lbl.Tag;  115                 e.Graphics.SetGDIHigh();  116  117                 if (menu.ShowTip)  118                 {  119                     if (!string.IsNullOrEmpty(menu.TipText))  120                     {  121                         var rect = new Rectangle(lbl.Width - 25, lbl.Height / 2 - 10, 20, 20);  122                         var path = rect.CreateRoundedRectanglePath(5);  123                         e.Graphics.FillPath(new SolidBrush(tipColor), path);  124                         e.Graphics.DrawString(menu.TipText, new Font("微软雅黑", 8f), new SolidBrush(Color.White), rect, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });  125                     }  126                     else  127                     {  128                         e.Graphics.FillEllipse(new SolidBrush(tipColor), new Rectangle(lbl.Width - 20, lbl.Height / 2 - 10, 10, 10));  129                     }  130                 }  131                 if (menu.Icon != null)  132                 {  133                     e.Graphics.DrawImage(menu.Icon, new Rectangle(1, (lbl.Height - 25) / 2, 25, 25), 0, 0, menu.Icon.Width, menu.Icon.Height, GraphicsUnit.Pixel);  134                 }  135             }  136         }

全部代码

  1 // ***********************************************************************    2 // Assembly         : HZH_Controls    3 // Created          : 2019-10-11    4 //    5 // ***********************************************************************    6 // <copyright file="UCNavigationMenuExt.cs">    7 //     Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:[email protected]    8 // </copyright>    9 //   10 // Blog: https://www.cnblogs.com/bfyx   11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl   12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git   13 //   14 // If you use this code, please keep this note.   15 // ***********************************************************************   16 using System;   17 using System.Collections.Generic;   18 using System.ComponentModel;   19 using System.Drawing;   20 using System.Data;   21 using System.Linq;   22 using System.Text;   23 using System.Windows.Forms;   24 using HZH_Controls.Forms;   25   26 namespace HZH_Controls.Controls   27 {   28     /// <summary>   29     /// Class UCNavigationMenuExt.   30     /// Implements the <see cref="System.Windows.Forms.UserControl" />   31     /// </summary>   32     /// <seealso cref="System.Windows.Forms.UserControl" />   33     [DefaultEvent("ClickItemed")]   34     public partial class UCNavigationMenuExt : UserControl   35     {   36         /// <summary>   37         /// Occurs when [click itemed].   38         /// </summary>   39         [Description("点击节点事件"), Category("自定义")]   40   41         public event EventHandler ClickItemed;   42         /// <summary>   43         /// The select item   44         /// </summary>   45         private NavigationMenuItemExt selectItem = null;   46   47         /// <summary>   48         /// Gets the select item.   49         /// </summary>   50         /// <value>The select item.</value>   51         [Description("选中的节点"), Category("自定义")]   52         public NavigationMenuItemExt SelectItem   53         {   54             get { return selectItem; }   55             private set { selectItem = value; }   56         }   57   58         /// <summary>   59         /// The items   60         /// </summary>   61         NavigationMenuItemExt[] items;   62   63         /// <summary>   64         /// Gets or sets the items.   65         /// </summary>   66         /// <value>The items.</value>   67         [Description("节点列表"), Category("自定义")]   68         public NavigationMenuItemExt[] Items   69         {   70             get { return items; }   71             set   72             {   73                 items = value;   74                 ReloadMenu();   75             }   76         }   77         /// <summary>   78         /// The tip color   79         /// </summary>   80         private Color tipColor = Color.FromArgb(255, 87, 34);   81   82         /// <summary>   83         /// Gets or sets the color of the tip.   84         /// </summary>   85         /// <value>The color of the tip.</value>   86         [Description("角标颜色"), Category("自定义")]   87         public Color TipColor   88         {   89             get { return tipColor; }   90             set { tipColor = value; }   91         }   92   93         /// <summary>   94         /// 获取或设置控件的前景色。   95         /// </summary>   96         /// <value>The color of the fore.</value>   97         /// <PermissionSet>   98         ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />   99         /// </PermissionSet>  100         public override System.Drawing.Color ForeColor  101         {  102             get  103             {  104                 return base.ForeColor;  105             }  106             set  107             {  108                 base.ForeColor = value;  109                 foreach (Control c in this.Controls)  110                 {  111                     c.ForeColor = value;  112                 }  113             }  114         }  115         /// <summary>  116         /// 获取或设置控件显示的文字的字体。  117         /// </summary>  118         /// <value>The font.</value>  119         /// <PermissionSet>  120         ///   <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />  121         ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />  122         ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence" />  123         ///   <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />  124         /// </PermissionSet>  125         public override Font Font  126         {  127             get  128             {  129                 return base.Font;  130             }  131             set  132             {  133                 base.Font = value;  134                 foreach (Control c in this.Controls)  135                 {  136                     c.Font = value;  137                 }  138             }  139         }  140  141         /// <summary>  142         /// The m LST anchors  143         /// </summary>  144         Dictionary<NavigationMenuItemExt, FrmAnchor> m_lstAnchors = new Dictionary<NavigationMenuItemExt, FrmAnchor>();  145         /// <summary>  146         /// Initializes a new instance of the <see cref="UCNavigationMenuExt"/> class.  147         /// </summary>  148         public UCNavigationMenuExt()  149         {  150             InitializeComponent();  151             items = new NavigationMenuItemExt[0];  152             if (ControlHelper.IsDesignMode())  153             {  154                 items = new NavigationMenuItemExt[4];  155                 for (int i = 0; i < 4; i++)  156                 {  157                     items[i] = new NavigationMenuItemExt()  158                     {  159                         Text = "菜单" + (i + 1),  160                         AnchorRight = i >= 2  161                     };  162                 }  163             }  164         }  165  166         /// <summary>  167         /// Reloads the menu.  168         /// </summary>  169         private void ReloadMenu()  170         {  171             try  172             {  173                 ControlHelper.FreezeControl(this, true);  174                 this.Controls.Clear();  175                 if (items != null && items.Length > 0)  176                 {  177                     foreach (var item in items)  178                     {  179                         var menu = (NavigationMenuItemExt)item;  180                         Label lbl = new Label();  181                         lbl.AutoSize = false;  182                         lbl.TextAlign = ContentAlignment.MiddleCenter;  183                         lbl.Width = menu.ItemWidth;  184                         lbl.Text = menu.Text;  185  186                         lbl.Font = Font;  187                         lbl.ForeColor = ForeColor;  188  189                         lbl.Paint += lbl_Paint;  190                         lbl.MouseEnter += lbl_MouseEnter;  191                         lbl.Tag = menu;  192                         lbl.Click += lbl_Click;  193                         if (menu.AnchorRight)  194                         {  195                             lbl.Dock = DockStyle.Right;  196                         }  197                         else  198                         {  199                             lbl.Dock = DockStyle.Left;  200                         }  201                         this.Controls.Add(lbl);  202  203                         lbl.BringToFront();  204                     }  205  206  207                 }  208             }  209             finally  210             {  211                 ControlHelper.FreezeControl(this, false);  212             }  213         }  214  215         /// <summary>  216         /// Handles the Click event of the lbl control.  217         /// </summary>  218         /// <param name="sender">The source of the event.</param>  219         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>  220         void lbl_Click(object sender, EventArgs e)  221         {  222             Label lbl = sender as Label;  223             if (lbl.Tag != null)  224             {  225                 var menu = (NavigationMenuItemExt)lbl.Tag;  226                 if (menu.ShowControl == null)  227                 {  228                     selectItem = menu;  229  230                     while (m_lstAnchors.Count > 0)  231                     {  232                         try  233                         {  234                             foreach (var item in m_lstAnchors)  235                             {  236                                 item.Value.Hide();  237                             }  238                         }  239                         catch { }  240                     }  241  242                     if (ClickItemed != null)  243                     {  244                         ClickItemed(this, e);  245                     }  246                 }  247             }  248         }  249         /// <summary>  250         /// Handles the MouseEnter event of the lbl control.  251         /// </summary>  252         /// <param name="sender">The source of the event.</param>  253         /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>  254         void lbl_MouseEnter(object sender, EventArgs e)  255         {  256             Label lbl = sender as Label;  257             var menu = lbl.Tag as NavigationMenuItemExt;  258             foreach (var item in m_lstAnchors)  259             {  260                 m_lstAnchors[item.Key].Hide();  261             }  262             if (menu.ShowControl != null)  263             {  264                 if (!m_lstAnchors.ContainsKey(menu))  265                 {  266                     m_lstAnchors[menu] = new FrmAnchor(lbl, menu.ShowControl);  267                 }  268                 m_lstAnchors[menu].Show();  269                 m_lstAnchors[menu].Size = menu.ShowControl.Size;  270             }  271         }  272         /// <summary>  273         /// Handles the Paint event of the lbl control.  274         /// </summary>  275         /// <param name="sender">The source of the event.</param>  276         /// <param name="e">The <see cref="PaintEventArgs" /> instance containing the event data.</param>  277         void lbl_Paint(object sender, PaintEventArgs e)  278         {  279             Label lbl = sender as Label;  280             if (lbl.Tag != null)  281             {  282                 var menu = (NavigationMenuItemExt)lbl.Tag;  283                 e.Graphics.SetGDIHigh();  284  285                 if (menu.ShowTip)  286                 {  287                     if (!string.IsNullOrEmpty(menu.TipText))  288                     {  289                         var rect = new Rectangle(lbl.Width - 25, lbl.Height / 2 - 10, 20, 20);  290                         var path = rect.CreateRoundedRectanglePath(5);  291                         e.Graphics.FillPath(new SolidBrush(tipColor), path);  292                         e.Graphics.DrawString(menu.TipText, new Font("微软雅黑", 8f), new SolidBrush(Color.White), rect, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });  293                     }  294                     else  295                     {  296                         e.Graphics.FillEllipse(new SolidBrush(tipColor), new Rectangle(lbl.Width - 20, lbl.Height / 2 - 10, 10, 10));  297                     }  298                 }  299                 if (menu.Icon != null)  300                 {  301                     e.Graphics.DrawImage(menu.Icon, new Rectangle(1, (lbl.Height - 25) / 2, 25, 25), 0, 0, menu.Icon.Width, menu.Icon.Height, GraphicsUnit.Pixel);  302                 }  303             }  304         }  305     }  306 }

View Code

 

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧