【问题标题】:How can I check if the Property value of type Enum in a Custom Control has changed?如何检查自定义控件中枚举类型的属性值是否已更改?
【发布时间】:2018-08-27 06:21:37
【问题描述】:

我创建了一个继承自 Button 的自定义控件类。
我这样做的原因是我需要创建相同的 Button,而且我不想每次都做所有事情。
另外,我想要一个用于我添加的属性的下拉列表选择器,可以从表单设计器中的属性网格访问。

例如,我想要三种不同的颜色而没有其他颜色,所以我想要为这个新属性启用一个 DropDown 选择器。我为此使用了一个枚举并且它有效,但问题是当我选择例如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;
    }
}

【问题讨论】:

  • 构造函数首先被调用 - 在任何其他代码之前......所以也许你需要将你的 CLR if 语句移动到另一个方法中,并在你更改 CLR 值时调用它

标签: c# winforms oop controls custom-controls


【解决方案1】:

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

您的公共财产被委派给这个任务。

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

如果您想在设计时在“属性”窗口中隐藏控件的 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
}

【讨论】:

  • @HeroOfSkies 很高兴它有帮助 :) 请注意,要更改背景颜色,我使用了 this.BackColor = Color.FromName(value.ToString())。这意味着NormalColor 枚举器中的颜色列表必须是KnownColor 名称,否则该方法将失败。如果您打算使用特殊名称(不包括在KnownColor 列表中),请相应地修改该方法。
【解决方案2】:

当你实例化按钮类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*/
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2011-12-24
    • 2013-06-14
    相关资源
    最近更新 更多