【问题标题】:Custom Winforms Controls (a button specifically)自定义 Winforms 控件(专门的按钮)
【发布时间】:2009-06-30 19:38:16
【问题描述】:

我正在尝试创建一个自定义按钮,其中前景色始终为深红色,背景色始终为青色。丑陋的配色方案,但我只是想得到它,这样我就可以创建大量具有一致配色方案的控件,而无需单独设置每个控件。以下是我对按钮的编码方式:

public partial class CustomButton : Button
{
    private static Color _defaultForeColor = Color.Crimson;
    private static Color _defaultBackColor = Color.Cyan;

    public CustomButton()
    {
        InitializeComponent();
        base.ForeColor = _defaultForeColor;
        base.BackColor = _defaultBackColor;
    }


    public AutoScaleMode AutoScaleMode { get; set; }

    [DefaultValue(typeof(Color), "Crimson")]
    override public Color ForeColor
    {
        get { return base.ForeColor; }
        set
        {
            base.ForeColor = _defaultForeColor;
        }
    }

    [DefaultValue(typeof(Color), "Cyan")]
    public override Color BackColor
    {
        get { return base.BackColor; }
        set
        {
            base.BackColor = _defaultBackColor;
        }
    }        
}

当我将自定义按钮放到表单上时,背景是常规按钮颜色,文本是深红色。如果我运行该应用程序,它也是一样的。现在,如果我尝试在属性窗口中修改前景色或背景色,它们会立即返回到我设置的默认值(深红色、青色),然后当我运行我的应用程序时它们也会以这种方式显示。如何让控件在设计器中和运行时正确显示?

【问题讨论】:

    标签: winforms custom-controls


    【解决方案1】:

    存在问题是因为 UseVisualStyleBackColor 自动设置为 true 并且您无法覆盖它。如果将其更改为 false,您会注意到您的按钮将正常工作。

    一种选择是像这样覆盖按钮的 OnControlAdded:

    protected override void OnControlAdded(ControlEventArgs e)
    {
        base.OnControlAdded(e);
        UseVisualStyleBackColor = false;
    }
    

    第一次在设计器中,颜色不会显示,但是当您运行应用程序时,它会正常工作。

    【讨论】:

      【解决方案2】:

      我建议您将前后颜色绑定到例如应用程序设置(或特定于您的控件的设置类)。标准按钮并在设计器中绑定,或使用您自己的后代并在代码中绑定。在这种情况下,您将拥有一致的配色方案,更重要的是,您无需重新编译即可更改它。

      public class CustomButton : Button
      {
          public CustomButton
          {
              InitializeComponent();
              if (!DesignMode)
              {
                  DataBindings.Add(new Binding("ForeColor", Settings.Default, "ButtonForeColor", true, DataSourceUpdateMode.Never));
                  DataBindings.Add(new Binding("BackColor", Settings.Default, "ButtonBackColor", true, DataSourceUpdateMode.Never));
              }
          }
      
          // ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        相关资源
        最近更新 更多