克隆控件 - C# (Winform)

17

可能是重复问题:
有可能复制某个控件的所有属性吗?(C#窗体应用程序)

我需要创建一些与在设计时创建的控件类似的控件。创建的控件应该具有预定义控件相同的属性,换句话说,我想要复制一个控件。是否有一行代码可以实现这个目的?还是我必须通过一行行的代码来设置每个属性? 目前我的做法是:

        ListContainer_Category3 = new FlowLayoutPanel();
        ListContainer_Category3.Location = ListContainer_Category1.Location;
        ListContainer_Category3.BackColor = ListContainer_Category1.BackColor;
        ListContainer_Category3.Size = ListContainer_Category1.Size;
        ListContainer_Category3.AutoScroll = ListContainer_Category1.AutoScroll;
1个回答

36

一般来说,您可以使用反射将对象的公共属性复制到新实例中。

然而,在处理控件时,您需要小心。某些属性(例如WindowTarget)仅供框架基础结构使用,因此您需要将它们过滤掉。

在完成过滤工作之后,您可以编写所需的一行代码:

Button button2 = button1.Clone();

这里有一段代码可以帮助你入门:
public static class ControlExtensions
{
    public static T Clone<T>(this T controlToClone) 
        where T : Control
    {
        PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

        T instance = Activator.CreateInstance<T>();

        foreach (PropertyInfo propInfo in controlProperties)
        {
            if (propInfo.CanWrite)
            {
                if(propInfo.Name != "WindowTarget")
                    propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
            }
        }

        return instance;
    }
}

当然,您仍需要调整命名、位置等。同时,可能需要处理包含的控件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接