我正在为特定应用程序开发一组自定义控件。我想定义属性,这些属性在出于外观目的的控件集上是通用的,为了参数的缘故,让它成为CustomCtrl.AccentColor
我想为我的Windows窗体Form1.AccentColor
定义相同的属性,当我更改它时,所有自定义控件“AccentColor
都应该更改,就像我更改ForeColor
时一样我的表单,所有标签'和按钮'等ForeColor
随之改变。
是否可以做到这一点,还是我必须努力循环所有自定义控件并逐个更改?
答案 0 :(得分:2)
简答
由于您可以在注释中提到所有控件的公共基类,因此您可以创建基类,然后使用ambient属性等行为添加一些属性(如{{1} })到基类控件类。
详细答案
环境属性是控件上的属性,如果未设置,则从父控件中检索。
在我们的实现中,我们使用Font
方法从父Form
获取值。所以在实现中,当获取属性值时,我们检查值是否等于默认值,如果父类具有相同的属性,我们返回父表单的属性值,否则我们返回控件本身的属性值。
添加FindForm
属性后,在这种情况下,我们还应该实现XXXX
和ShouldSerializeXXXX
方法,让设计人员在序列化属性时以及在右键单击属性时如何重置值然后选择重置。
<强> MyBaseControl 强>
ResetXXXX
<强> MyBaseForm 强>
using System.Drawing;
using System.Windows.Forms;
public class MyBaseControl : Control
{
public MyBaseControl()
{
accentColor = Color.Empty;
}
private Color accentColor;
public Color AccentColor
{
get
{
if (accentColor == Color.Empty && ParentFormHasAccentColor())
return GetParentFormAccentColor();
return accentColor;
}
set
{
if (accentColor != value)
accentColor = value;
}
}
private bool ParentFormHasAccentColor()
{
return this.FindForm() != null &&
this.FindForm().GetType().GetProperty("AccentColor") != null;
}
private Color GetParentFormAccentColor()
{
if (ParentFormHasAccentColor())
return (Color)this.FindForm().GetType()
.GetProperty("AccentColor").GetValue(this.FindForm());
else
return Color.Red;
}
private bool ShouldSerializeAccentColor()
{
return this.AccentColor != GetParentFormAccentColor();
}
private void ResetAccentColor()
{
this.AccentColor = GetParentFormAccentColor();
}
}
<强> Form1中强>
public class BaseForm : Form
{
[DefaultValue("Red")]
public Color AccentColor { get; set; }
public BaseForm()
{
this.AccentColor = Color.Red;
}
}
答案 1 :(得分:0)
我认为您可以从Control类创建继承类并在那里定义您的公共属性,然后从该类继承您的自定义控件并使用parent属性访问容器(如Form)并从中获取属性值