我正在为特定应用程序开发一组自定义控件。为了外观目的,我想定义一组控件通用的属性,为了论证,让我们将其设为 CustomCtrl.AccentColor
我想为我的 Windows 窗体定义相同的属性,即 Form1.AccentColor
,当我更改它时,所有自定义控件的 AccentColor
都应该更改,就像我更改了表单的 ForeColor
,所有标签和按钮等 ForeColor
也随之更改。
是否有可能做到这一点,还是我必须满足于循环所有自定义控件并逐一更改它的工作?
最佳答案
简答
正如您在注释中提到的那样,由于您可以为所有控件拥有一个通用基类,因此您可以选择创建一个基类,然后添加一些具有类似 ambient 行为的属性。属性(如Font
)到基本控件类。
详细答案
环境属性是控件上的属性,如果未设置,则从父控件中检索该属性。
在我们的实现中,我们使用 FindForm
方法从父 Form
获取值。所以在实现中,当获取属性值时,我们检查该值是否等于默认值,如果父窗体具有相同的属性,则返回父窗体的属性值,否则返回控件本身的属性值。
添加XXXX
属性后,在这种情况下我们还应该实现ShouldSerializeXXXX
和ResetXXXX
方法,让设计者何时序列化属性以及如何序列化当您右键单击属性并选择重置时重置值。
MyBaseControl
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();
}
}
MyBaseForm
public class BaseForm : Form
{
[DefaultValue("Red")]
public Color AccentColor { get; set; }
public BaseForm()
{
this.AccentColor = Color.Red;
}
}
表格1
public partial class Form1 : BaseForm
{
public Form1()
{
InitializeComponent();
}
}
关于c# - 将父控件的属性传递给子控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34916114/