Если вы пытаетесь клонировать элементы UIE, используйте XamlWriter для сохранения в строку, хотя ни один метод клонирования не является надежным. Затем вы используете XamlReader для загрузки копии. Вы все еще можете столкнуться с проблемами. Такие вещи, как обработчики, которые не копируются, x: дублирование имени и т. Д. Но для простых элементов, таких как Grid или Brush, это прекрасно работает.
Редактировать 1: Не существует общего способа клонирования чего-либо, однако:
1) Если функция клона написана правильно, она вызовет для вас базовый клон и скопирует содержимое базового класса. Если он написан неправильно, вызов базового Clone не сильно поможет, хотя вы можете вызвать приватный метод таким образом .
2) Если вам нужно, вы можете использовать Reflection, чтобы скопировать почти все, даже обработчики щелчков, из старого объекта в новый.
3) XamlWriter и XamlReader будут копировать и создавать экземпляры объектов-иерархий, просто минус определенные свойства.
Редактировать 2: Вот общий шаблон дизайна клонирования, который я использую в своих иерархиях классов. Предположим, что форма базового класса, производный класс круга:
protected Circle(Circle t)
{
CopyFrom(t);
}
public override object Clone()
{
return new Circle(this);
}
protected void CopyFrom(Circle t)
{
// Ensure we have something to copy which is also not a self-reference
if (t == null || object.ReferenceEquals(t, this))
return;
// Base
base.CopyFrom((Shape)t);
// Derived
Diameter = t.Diameter;
}