c# - 将父控件的属性传递给子控件

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

我正在为特定应用程序开发一组自定义控件。为了外观目的,我想定义一组控件通用的属性,为了论证,让我们将其设为 CustomCtrl.AccentColor

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

是否有可能做到这一点,还是我必须满足于循环所有自定义控件并逐一更改它的工作?

最佳答案

简答

正如您在注释中提到的那样,由于您可以为所有控件拥有一个通用基类,因此您可以选择创建一个基类,然后添加一些具有类似 ambient 行为的属性。属性(如Font)到基本控件类。


详细答案

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

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

添加XXXX属性后,在这种情况下我们还应该实现ShouldSerializeXXXXResetXXXX方法,让设计者何时序列化属性以及如何序列化当您右键单击属性并选择重置时重置值。

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/

相关文章:

c# - 我需要保留对 FileSystemWatcher 的引用吗?

c# - 如何在拖动时滚动 flowlayoutpanel?

c# - 将窗口保持在顶部并在 WinForms 中窃取焦点

Java Android 属性文件

ios - 弱 IBOutlet UIView 属性将变为 nil

C# 手动线程

c# - MailKit Imap 获取邮件的已读和未读状态

c# - log4net 从 BufferedAppender 保存缓冲区

c# - 无论如何通过 XAML 事件监听器传递 WPF 控件以在后面的代码中使用?

c# - 属性永远不会为 null c#