无法使用 UserControl 的重写背景颜色 属性

Unable to use the overridden BackColor property of a UserControl

场景

我正在使用 UserControl 创建自定义控件。

我正在尝试 覆盖 UserControl 的 BackColor 属性,以便在 BackColor 属性 更改 UserControl,控件的 BackColor 不会更改,值存储在名为 BackColor_Value 的变量中:

这是它的代码:

Color BackColor_Value = Color.FromKnownColor(KnownColor.ActiveCaption);
[Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Bindable(true)]
//[AmbientValue(false)]
//[DefaultValue(typeof(Color), "ActiveCaption")]
public override Color BackColor
{
      get
      {
          return BackColor_Value;
      }
      set
      {
          BackColor_Value = value;
      }
 }

注意: BackColor 只是存储在一个变量中,并没有在任何地方使用。

编辑:我想要完成的是在设置 UserControl 的背景色 属性 时更改所选控件的背景色,留下用户控件的背景颜色不变。

问题

出于某种原因,控件的背景色根据我指定的变量 BackColor_Value 发生变化。

完整代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

namespace MaterialUI_Control
{
    public partial class MaterialPanel : UserControl
    {
        public MaterialPanel()
        {
            InitializeComponent();
        }

        Color BackColor_Value = Color.FromKnownColor(KnownColor.ActiveCaption);
        [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [Bindable(true)]
        [AmbientValue(false)]
        [DefaultValue(typeof(Color), "ActiveCaption")]
        public override Color BackColor
        {
            get
            {
                return BackColor_Value;
            }
            set
            {
                BackColor_Value = value;
                this.Refresh();
            }
        }
    }
}

BackColor property will be used by OnPaintBackground 方法呈现控件。如果您想将 BackColor 属性 用于其他目的,您可以使用以下任一选项:

  • 覆盖 OnPaintBackground 并自己绘制背景(忽略 BackColor
  • Shadow/hide BackColor 属性

你还需要考虑另一个关于 BackColor 属性 的事实,它是一个 ambient property,这意味着如果你没有明确设置它,它将遵循的值父控件的 BackColor 属性。

示例 1 - 覆盖 OnPaintBackground 并自己绘制背景

您可以覆盖OnPaintBackground方法并忽略BackColor的值属性:

protected override void OnPaintBackground(PaintEventArgs e)
{
    var method = typeof(Control).GetMethod("PaintBackground",
        System.Reflection.BindingFlags.Instance |
        System.Reflection.BindingFlags.NonPublic,
        null,
        new Type[] { typeof(PaintEventArgs), typeof(Rectangle), typeof(Color) },
        null);

    //Paint with a default constant back color, here for example Color.Red
    method.Invoke(this, new object[] { e, ClientRectangle, Color.Red });
}

在这种情况下,更改背景色不会更改控件的呈现,但会更改未明确分配 BackColor 的子控件的 BackColor

例2 - Shadow/hide BackColor 属性

你可以shadow/hide BackColor 属性:

public new Color BackColor { get; set; }

在这种情况下,改变背景颜色不会改变你的控件的渲染,它对子控件也没有影响,如果你想改变子控件的背景颜色,你需要添加一些逻辑setter 的 属性。

还要设置OnPaintBackground使用的颜色,在构造函数中,你可以设置base.BackColor = Color.Blue;什么的。