将父控件的属性传递给子控件

时间:2016-01-21 05:35:10

标签: c# winforms properties user-controls windows-forms-designer

我正在为特定应用程序开发一组自定义控件。我想定义属性,这些属性在出于外观目的的控件集上是通用的,为了参数的缘故,让它成为CustomCtrl.AccentColor

我想为我的Windows窗体Form1.AccentColor定义相同的属性,当我更改它时,所有自定义控件“AccentColor都应该更改,就像我更改ForeColor时一样我的表单,所有标签'和按钮'等ForeColor随之改变。

是否可以做到这一点,还是我必须努力循环所有自定义控件并逐个更改?

2 个答案:

答案 0 :(得分:2)

简答

由于您可以在注释中提到所有控件的公共基类,因此您可以创建基类,然后使用ambient属性等行为添加一些属性(如{{1} })到基类控件类。

详细答案

环境属性是控件上的属性,如果未设置,则从父控件中检索。

在我们的实现中,我们使用Font方法从父Form获取值。所以在实现中,当获取属性值时,我们检查值是否等于默认值,如果父类具有相同的属性,我们返回父表单的属性值,否则我们返回控件本身的属性值。

添加FindForm属性后,在这种情况下,我们还应该实现XXXXShouldSerializeXXXX方法,让设计人员在序列化属性时以及在右键单击属性时如何重置值然后选择重置。

<强> 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)并从中获取属性值