【发布时间】:2020-04-21 02:08:27
【问题描述】:
场景
我正在使用 UserControl 来创建自定义控件。
我正在尝试覆盖 UserControl 的 BackColor 属性,以便在 UserControl 的 BackColor 属性更改时,控件的 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 属性时更改所选控件的 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();
}
}
}
}
【问题讨论】:
-
在属性 getter 中设置
return Color.FromKnownColor(KnownColor.ActiveCaption);。即,不要返回BackColor_Value。 -
否则,使用
public new Color BackColor,在构造函数中设置base.BackColor = Color.FromKnownColor(KnownColor.ActiveCaption);,在属性设置器中删除this.Refresh();(因为你实际上并没有改变任何东西)。 -
BackColor属性将被OnPaintBackground方法用于呈现控件。如果要将BackColor属性用于其他目的,则需要覆盖OnPaintBackground以不依赖BackColor。或者您可以隐藏/隐藏属性public new Color BackColor { get; set; }。但总的来说,对我来说,这看起来像是一个 XY 问题。您要解决的读取问题是什么?
标签: c# winforms user-controls .net-3.5 gdi