c# - 如何检查自定义控件中枚举类型的属性值是否已更改?

标签 c# winforms oop controls custom-controls

我创建了一个继承自 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;
    }
}

最佳答案

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

您的公共(public)属性已委托(delegate)给此任务。

Note that I've inserted the InitializeComponent() procedure, so the Control can be dropped in a container from the ToolBox.

如果您想在设计时在属性窗口中隐藏控件的 BackColor 属性,请重写该属性并将其隐藏:

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

您可以这样更改您的CustomButton:
(使用当前设置,当您将控件从工具箱放到窗体上时,它将使用红色 BackColor 和白色 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
}

关于c# - 如何检查自定义控件中枚举类型的属性值是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49350292/

相关文章:

c# - Ninject - 不同的解决方案配置

c# - 从父级在 PictureBox 上画一条线

c - 在不使用函数指针的情况下替代在 C 中引用虚拟表。

php 面向对象的可见性

c# - 轻松返回数组的单行

c# - 在调用的方法中抛出异常时,如何使用 MethodInfo.Invoke 获取作为引用传递的参数值

c# - 我正在尝试测试字符串是否存在子字符串,想知道是否可以使用 "contains"还是需要其他东西?

c# - 自动完成导致崩溃

c# - 计算 ScrollBar 滚动百分比;滚动条的高度 "bar"?

php - 这个 OOD 实现正确吗?