zoukankan      html  css  js  c++  java
  • (八十三)c#Winform自定义控件-导航菜单(扩展)-HZHControls

    官网

    http://www.hzhcontrols.com

    前提

    入行已经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:623128629@qq.com
      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 点个星星吧

  • 相关阅读:
    AndroidStudio项目CMakeLists解析
    Xposed那些事儿 — xposed框架的检测和反制
    从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机
    编译Xposed
    常用的delphi 第三方控件
    delphi安装控件
    delphi控件安装与删除
    从今天开始,每天都要写博客,加油
    关于ArrayAdapter的getCount()的方法会造成空指针异常的分析
    实现ListView的加载更多的效果,如何将按钮布局到始终在ListView的最后一行
  • 原文地址:https://www.cnblogs.com/bfyx/p/11653011.html
Copyright © 2011-2022 走看看