如何在Winforms自定义控件中设置颜色的默认值?

22

我使用以下方式成功地显示了值:

    [DefaultValue ( typeof ( Color ), "255, 0, 0" )]
    public Color LineColor
    {
        get { return lineColor; }
        set { lineColor = value; Invalidate ( ); }
    }

但是我重新加载项目后,使用该控件时这个值被设置为白色,我可以调用Reset将其恢复为红色,但我不明白问题所在。

你应该如何设置默认值并确保除非手动从默认值更改才会保留它呢?

实际上我也在这样做,将BackColor和ForeColor设置为这些值,VS属性编辑器显示它们好像已从默认值更改。

这样做有问题吗?

    public CoolGroupBox ( )
    {
        InitializeComponent ( );
        base.BackColor = Color.FromArgb ( 5, 5, 5 );
        base.ForeColor = Color.FromArgb ( 0, 0, 0 );
    }
8个回答

27

技巧在于使用颜色的十六进制代码:

    [DefaultValue(typeof(Color), "0xFF0000")]
    public Color LineColor
    {
            get { return lineColor; }
            set { lineColor = value; Invalidate ( ); }
    }

我认为您也可以使用"255, 0, 0",但我不确定,通常我会使用命名颜色或十六进制代码。

1
我刚刚测试了一下,可以确认RGB字符串和ARGB字符串都是有效的。使用"255, 0, 0""255, 255, 0, 0"来表示红色。 - Nicholas Miller

11

那么直接将私有成员变量设置为您想要的默认颜色,怎么样?

private Color lineColor = Color.Red;

public Color LineColor
{
        get { return lineColor; }
        set { lineColor = value; Invalidate ( ); }
}

如果您想要它保留,只需删除设置访问器。

编辑

我明白了,您希望在设计器中显示默认颜色的属性列表。

您需要覆盖基本控件的BackColor属性,为您新的属性添加一个新的DefaultValueAttribute,然后在构造函数或InitializeComponent()方法(在designer.cs文件中)中实际设置默认颜色,后者可能更好,因为这是针对设计器的。

public partial class RedBackgroundControl : UserControl
{
    public RedBackgroundControl()
    {
        InitializeComponent();
        base.BackColor = Color.Red;
    }

    [DefaultValue(typeof(Color), "Red")]
    new public Color BackColor
    {
        get
        {
            return base.BackColor;
        }
        set
        {
            base.BackColor = value;
        }
    }
}

谢谢,当我这样做时,值仍然显示为BOLD,就像我从默认值更改了它一样。我还添加了DefaultValue属性,但这并没有改变任何东西。 - Joan Venge
我所说的“保留”是指最初的状态。之后用户可以将其设置为任何他们想要的状态。 - Joan Venge

4
[DefaultValue(...)] 属性是对设计师和代码生成器的提示,而不是编译器的指令。
更多信息请参见此 KB 文章

谢谢,我不知道这个。我使用了在构造函数内设置值和默认值的组合,现在它正确显示了。除了红色,必须是红色,如果是255、0、0,VS仍然认为它与红色不同。 - Joan Venge
它可以工作,但如果你使用255、0、0,VS会认为它与红色不同。它会显示为粗体。 - Joan Venge
它被反射使用,非常有用。 - Eric Ouellet

0

您可以在组件.designer.cs文件的Initializecomponent方法中设置特定属性:

  private void InitializeComponent()
    {
        components = new System.ComponentModel.Container();
        this.LineColor= System.Drawing.Color.FromArgb(255, 0, 0);
    }

重新构建项目,所有内容也应该显示在其中。

0

我使用了这段代码,它完美地运行了。

Private _BackColorSelect As Color = Color.FromArgb(214, 234, 248)

<DefaultValue(GetType(Color), "214, 234, 248")>
Public Property BackColorSelect As Color
    Get
        Return _BackColorSelect
    End Get
    Set(value As Color)
        _BackColorSelect = value
    End Set
End Property

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

我在使用DefaultValue属性时,对于类型为ColorFont的属性没有成功,但是我通过msdn文档中描述的以下方法成功了:

"使用ShouldSerialize和Reset方法定义默认值" http://msdn.microsoft.com/en-us/library/53b8022e(v=vs.90).aspx

我分别使用Color.Emptynull作为私有后备字段的值,并使公共属性始终返回有用的内容。


-1

CodeProject上有一篇关于defaultvalue属性初始化的文章。


然而,它并没有特别涉及颜色。 - Ray

-2

在 DependencyProperty 中使用 UIPropertyMetadata

例如:

public static DependencyProperty TrueColorProperty = DependencyProperty.Register(
        "TrueColor", typeof (Color), typeof (LedControl), new UIPropertyMetadata(Colors.Red));

问题是关于WinForms而不是WPF。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接