【问题标题】:How to set the default value of Colors in a custom control in Winforms?如何在 Winforms 的自定义控件中设置颜色的默认值?
【发布时间】:2010-12-04 01:53:43
【问题描述】:

我得到了正确显示的值:

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

但是我重新加载项目后使用的控件,这个值设置为White,我可以调用Reset重新回到Red,但是我不明白这个问题。

你应该如何设置默认值并确保它被保留,除非我手动更改默认值?

其实我也是这样做的,将 Back 和 ForeColor 设置为这些值,VS 属性编辑器将它们显示为好像它们是从默认值更改的一样。

这是错的吗?

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

【问题讨论】:

    标签: c# .net gdi+ winforms


    【解决方案1】:

    诀窍是使用颜色的十六进制代码:

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

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

    【讨论】:

    • 我刚刚测试过,可以确认RGB字符串和ARGB字符串都是有效的。使用"255, 0, 0""255, 255, 0, 0" 代表红色。
    【解决方案2】:

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

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

    如果您希望它保留,只需取出 set 访问器即可。

    编辑

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

    你必须重写基础控件的 BackColor 属性,为你的 new 属性添加一个新的 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;
            }
        }
    }
    

    【讨论】:

    • 谢谢,当我这样做时,该值仍然显示为粗体,就像我从默认值更改了它一样。我还添加了 DefaultValue 属性,但这并没有改变任何东西。
    • 我最初的意思是保存。之后,用户可以将其设置为任何他们想要的。
    【解决方案3】:

    [DefaultValue(...)] 属性是对设计人员和代码生成器的提示。它不是对编译器的指令。

    this KB article 中的更多信息。

    【讨论】:

    • 谢谢,我不知道。我使用了在构造函数中设置值和默认值的组合,它现在正确显示。除了Red,一定是Red,如果是255、0、0,VS还是觉得和Red不一样。
    • 它可以,但是如果你使用255,0,0,VS认为它与Red不同。它显示为粗体。
    • 反射式使用,非常好用。
    【解决方案4】:

    我没有任何运气使用带有ColorFont 类型属性的DefaultValue 属性,但我确实成功地使用了msdn 文档中描述的这些方法:

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

    我分别使用Color.Emptynull 作为我的私有支持字段的值,并让公共属性总是返回有用的东西。

    【讨论】:

      【解决方案5】:

      您可以在Initializecomponent Method中的component.designer.cs中设置具体的Attribute:

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

      重建项目,一切都应该显示在

      【讨论】:

        【解决方案6】:

        CodeProject上有相当篇关于defaultvalue属性初始化的文章

        【讨论】:

        • 然而它并没有特别提到颜色。
        【解决方案7】:

        在 DependencyProperty 中使用 UIPropertyMetadata

        喜欢:

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

        【讨论】:

        • 问题是关于 winforms 而不是 wpf
        猜你喜欢
        • 1970-01-01
        • 2012-08-30
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 2012-10-03
        相关资源
        最近更新 更多