• C#自定义控件导航菜单(自定义事件,属性)


    自定义控件:组合控件,实现导航菜单的功能

    1,属性

    经过分析控件功能,有以下属性

    【1.1】导航栏图片:Image NaviImage

    【1.2】导航按钮名:String NaviName

    【1.3】是否激活:Bool IsActive

    【1.4】激活滑块变距:Int ActiveGap

    【1.5】激活方块高度:Int ActiveHeight

    【1.6】激活方块颜色:Color ActiveColor

    【1.7】悬浮的渐变色系数:Float ColorDepth

    【1.8】权限:Int Role

    【1.9】单击事件:ClickEvent

    2,添加用户控件

    添加“用户控件”

    注意:字体和大小要与主窗体一致,要不然会导致拖入后大小不匹配的情况

    3,UI设计

    让Label标签字体永远在下方,居中显示,的设置

     

     4,添加属性

    【4.1】哪些属性需要propfull,哪些属性只用prop就可以,取决于这个属性是否要实时刷新

    5,添加事件

    【5.1】

     6,代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Jason_Controls
    {
        //【自定义事件步骤3:最关键的设置,被调用的时候,默认就是调用这个ClickEvent事件】
        [DefaultEvent("ClickEvent")]
        public partial class NaviButton : UserControl
        {
            public NaviButton()
            {
                InitializeComponent();
                SaveBackColor = this.BackColor;
            }
    
            private Color SaveBackColor;
    
            private Image naviImage=Properties.Resources.首页_32黑色;//一定要有个默认设置,要不然后面使用的时候,一直是null
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("导航按钮图片设置")]
            public Image NaviImage
            {
                get { return naviImage; }
                set
                {
                    naviImage = value;
                    this.pic_main.Image = naviImage;
                }
            }
    
            private String naviName = "实时监控";
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("导航按钮名称设置")]
            public String NaviName
            {
                get { return naviName; }
                set
                {
                    naviName = value;
                    this.lbl_naviName.Text = naviName;
                }
            }
    
            private bool isActive = false;
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("导航按钮是否激活")]
            public bool IsActive
            {
                get { return isActive; }
                set
                {
                    isActive = value;
                    this.Invalidate();//重绘
                }
            }
    
            private int activeGap = 0;
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("激活方块边距")]
            public int ActiveGap
            {
                get { return activeGap; }
                set
                {
                    activeGap = value;
                    this.Invalidate();//重绘
                }
            }
    
            private int activeHeight = 4;
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("激活方块高度")]
            public int ActiveHeight
            {
                get { return activeHeight; }
                set
                {
                    activeHeight = value;
                    this.Invalidate();//重绘
                }
            }
    
            private Color activeColor = Color.FromArgb(236,250,243);
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("激活方块的颜色")]
            public Color ActiveColor
            {
                get { return activeColor; }
                set
                {
                    activeColor = value;
                    this.Invalidate();//重绘
                }
            }
    
            //这个属性不用实时刷新,就不需要propfull来设置属性了
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("权限等级")]
            public int Role { get; set; } = 0;
    
            private void NvaiButton_Load(object sender, EventArgs e)
            {
    
            }
    
            //【自定义事件步骤1:自定义一个Event】
            [Browsable(true)]
            [Category("Jason自定义事件")]
            [Description("导航按钮的单击事件")]
            public event EventHandler ClickEvent;
    
            //【自定义事件步骤2:什么时候调用这个事件】
            private void lbl_naviName_Click(object sender, EventArgs e)
            {
                if (ClickEvent != null)
                {
                    ClickEvent.Invoke(this,e);//【特别注意】第一个参数要用this,因为后面判断的时候要用,this就是指这个当前自定义控件NaviButton。
                                              //(如果后面不用判断,参数都无所谓,用sender或null都可以)
                    //ClickEvent.Invoke(sender,e);//【如果参数是sender,去点击的时候sender对应的就是这个Label标签】
                }
            }
    
            private void pic_main_Click(object sender, EventArgs e)
            {
                if (ClickEvent != null)
                {
                    ClickEvent.Invoke(this, e);
                }
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Graphics graphics = e.Graphics;
                //画矩形
                Rectangle rectangle = new Rectangle(activeGap, this.Height - activeHeight, this.Width - 2 * activeGap, activeHeight);
                if (IsActive)
                { 
                    graphics.FillRectangle(new SolidBrush(this.activeColor)  ,rectangle);
                }
                else
                {
                    graphics.FillRectangle(new SolidBrush(this.BackColor), rectangle);
                }
    
            }
    
            #region 渐变色设置
    
            //这个属性不用实时刷新,就不需要propfull来设置属性了
            [Browsable(true)]
            [Category("Jason自定义属性")]
            [Description("悬浮渐变色系数")]
            public float ColorDepth { get; set; } = -0.2f;
    
            //鼠标放上去,变色
            private void lbl_naviName_MouseEnter(object sender, EventArgs e)
            {
                this.BackColor = ChangeColor(this.BackColor, ColorDepth);
            }
    
            //鼠标移走,变回原有的颜色
            private void lbl_naviName_MouseLeave(object sender, EventArgs e)
            {
                this.BackColor = SaveBackColor;
            }
    
            /// <summary>
            /// 通用的颜色渐变方法:在某个颜色基础上,添加一个修正系数(-1到1之间)
            /// </summary>
            /// <param name="color"></param>
            /// <param name="correctionFactor"></param>
            /// <returns></returns>
            private Color ChangeColor(Color color, float correctionFactor)
            {
                if (correctionFactor > 1.0f) correctionFactor = 1.0f;
                if (correctionFactor < -1.0f) correctionFactor = -1.0f;
    
                float red = (float) color.R;
                float green = (float) color.G;
                float blue = (float) color.B;
    
                if (correctionFactor < 0)
                {
                    correctionFactor = 1 + correctionFactor;
                    red *= correctionFactor;
                    green *= correctionFactor;
                    blue *= correctionFactor;
                }
                else
                {
                    red = (255 - red) * correctionFactor + red;
                    green = (255 - green) * correctionFactor + green;
                    blue = (255 - blue) * correctionFactor + blue;
                }
    
                if (red < 0) red = 0;
                if (red > 255) red = 255;
                if (green < 0) green = 0;
                if (green > 255) green = 255;
                if (blue < 0) blue = 0;
                if (blue > 255) blue = 255;
                return Color.FromArgb(color.A, (int) red, (int) green, (int) blue);
            }
    
            #endregion
    
     
        }
    }
    

      

     

     7,特别注意:

     

  • 相关阅读:
    简单 || 复杂
    命令行参数 && json 协议 && 自定义 error 类型
    Circos安装 (转+总结)
    ggplot2—Pathway富集分析气泡图
    ggplot2绘图
    linux常用命令小结
    生信学习网站
    Perl学习建议(转)
    R作图函数(转)
    Android viewPager+fragment实现滑页效果
  • 原文地址:https://www.cnblogs.com/baozi789654/p/15616360.html
Copyright © 2020-2023  润新知