无法使用 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;
什么的。
场景
我正在使用 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;
什么的。