代码之家  ›  专栏  ›  技术社区  ›  user8524747

如何检查自定义控件中Enum类型的属性值是否已更改?

  •  2
  • user8524747  · 技术社区  · 6 年前

    我创建了一个自定义控件类,该类继承自 Button
    我这样做的原因是我需要创建相同的按钮,我不想每次都做任何事情。
    此外,我希望为我添加的属性提供一个下拉列表选择器,可以从表单设计器中的属性网格访问。

    例如,我想要三种不同的颜色,而不是其他颜色,因此我想要为这个新属性启用一个下拉选择器。我使用了一个枚举来实现这一点,但问题是当我选择例如 Red ,它不会改变颜色。我的代码是:

    public class CustomButton : Button
    {
        public NormalColor CLR { get; set; }
    
        public enum NormalColor
        {
            Red,
            Blue,
            Yellow
        }
    
        public CustomButton()
        {
            if (CLR == NormalColor.Blue)
            {
                BackColor = Color.Blue;
            }
            else if (CLR == NormalColor.Red)
            {
                BackColor = Color.Red;
            }
            else if (CLR == NormalColor.Yellow)
            {
                BackColor = Color.Yellow;
            }
            else
            {
                BackColor = Color.FromArgb(18, 18, 18);
            }
    
            ForeColor = Color.White;
            FlatAppearance.BorderSize = 0;
            FlatStyle = FlatStyle.Flat;
            Size = new Size(100, 100);
            MouseEnter += CustomButton_MouseEnter;
            MouseLeave += CustomButton_MouseLeave;
            MouseClick += CustomButton_MouseClick;
        }
    }
    
    2 回复  |  直到 3 年前
        1
  •  1
  •   Jimi    3 年前

    在控件构造函数中,可以定义其基本(默认)属性,而不是其行为或控件如何响应用户设置。

    您的公共属性已委托给此任务。

    请注意,我已插入 InitializeComponent() 程序,因此 控件可以从工具箱中放入容器中。

    如果要隐藏控件的 BackColor 在设计时,在属性窗口中,替代该属性并使用以下选项将其隐藏:

    [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]

    你可以改变你的 CustomButton 这样做:
    (使用当前设置,当您从工具箱中将控件放到窗体上时,它将以红色绘制。) 属性 还有一个白色的 ForeColor )。

    public class CustomButton : Button
    {
        private NormalColor CurrentColorSelection = 0;
        public NormalColor CLR
        {
            get { return CurrentColorSelection; }
            set { SetBackColor(value); }
        }
    
        public enum NormalColor
        {
            Red,
            Blue,
            Yellow
        }
    
        public CustomButton() => InitializeComponent();
    
        private void InitializeComponent()
        {
            SetBackColor(CurrentColorSelection);
            this.ForeColor = Color.White;
            this.FlatAppearance.BorderSize = 0;
            this.FlatStyle = FlatStyle.Flat;
            this.Size = new Size(100, 100);
            this.MouseEnter += this.CustomButton_MouseEnter;
            this.MouseLeave += this.CustomButton_MouseLeave;
            this.MouseClick += this.CustomButton_MouseClick;
        }
    
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
        public override Color BackColor
        {
            get { return base.BackColor; }
            set { base.BackColor = value; }
        }
    
        private void SetBackColor(NormalColor value)
        {
            this.CurrentColorSelection = value;
            this.BackColor = Color.FromName(value.ToString());
        }
        
       //(...)
       //Event Handlers
    }
    
        2
  •  0
  •   SSD    6 年前

    实例化button类时 constructor 首先执行,因此在代码流中确保在实例化时设置了CLR

    执行以下操作

    public class CustomButton : Button
    {
     public NormalColor CLR 
     { 
        get; 
        private set; 
     }
    
     public enum NormalColor
     {
        Red,
        Blue,
        Yellow
     }
    #region Constructor
    
    public CustomButton(NormalColor backgroundColor)
    {
        CLR = backgroundColor;
        if (CLR == NormalColor.Blue)
        {
            BackColor = Color.Blue;
        }
       /*Your other code*/
     }
    }