如何在设计时将复杂的 属性 值从一个用户控件复制到另一个用户控件?

How to copy a complex property value from one user control to another as design time?

TL;DR;
如何向复杂的多值 属性 添加复制粘贴功能,使我能够从一个用户控件复制 属性 值并在设计时将其粘贴到另一个?

说来话长

我创建了一个用户控件 (StylableControl),它有一个名为 Style.

的复杂 属性

此 属性 包含一个名为 StylableControlStyles 的 class 实例,其中包含多个名为 Style 的 class 实例,其中每个实例都包含BackColorForeColorImageGradient(我创建的另一个 class)等值。

我还创建了自定义控件设计器以允许编辑用户控件的样式 属性。它显示了一个表单,其中样式 属性 中的每个样式 class 都可以轻松编辑。

现在我想为该控件的用户提供一种简单的方法来从用户在设计时控制另一个实例。

当然,我可以覆盖 StylableControlStyles 对象的 ToString() 方法来创建一个字符串表示形式,该表示形式将封装保存在该对象中的所有数据,但那样会创建一个 hugh 字符串当然需要在 class 转换器中进行大量解析工作(目前我只使用 ExpandableObjectConverter)。
如果可能的话,我想避免这种情况。

根据 Ash 在评论中的建议,我使用 DesignerVerbStyle 复制并粘贴到控件设计器的 Style 类型的私有静态成员中,并从中复制粘贴。

所以在我的控件设计器中 class 我有:

private static ZControlStyle _CopiedStyle;

并添加了这些设计师动词:

_Verbs.Add(new DesignerVerb("Copy Styles", CopyStyle));
_Verbs.Add(new DesignerVerb("Paste Styles", PasteStyle));

以及复制和粘贴的方法:

private void PasteStyle(object sender, EventArgs e)
{
    if (_CopiedStyle != null)
    {
        var toggleButton = Control as ZToggleButton;
        if (toggleButton != null)
        {
            toggleButton.Style.FromStyle(_CopiedStyle);
        }
        else
        {
            (Control as ZControl).Style.FromStyle(_CopiedStyle);
        }

    }
}

private void CopyStyle(object sender, EventArgs e)
{
    var toggleButton = Control as ZToggleButton;
    if (toggleButton != null)
    {
        _CopiedStyle = toggleButton.Style;
    }
    else
    {
        _CopiedStyle = (Control as ZControl)?.Style;
    }
}