using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Markup; using System.Xml; namespace Tango.Editors { internal static class FrameworkElementCloner { /// /// Clones the specified element. /// /// The element. /// public static FrameworkElement Clone(FrameworkElement element) { var sb = new StringBuilder(); var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true, NamespaceHandling = NamespaceHandling.OmitDuplicates, }); var mgr = new XamlDesignerSerializationManager(writer); // HERE BE MAGIC!!! mgr.XamlWriterMode = XamlWriterMode.Expression; // THERE WERE MAGIC!!! XamlWriter.Save(element, mgr); String xaml = sb.ToString(); StringReader stringReader = new StringReader(xaml); XmlReader xmlReader = XmlReader.Create(stringReader); FrameworkElement cloned = (FrameworkElement)XamlReader.Load(xmlReader) as FrameworkElement; return cloned; } public static String Serialize(FrameworkElement element) { var sb = new StringBuilder(); var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true, NamespaceHandling = NamespaceHandling.OmitDuplicates, }); var mgr = new XamlDesignerSerializationManager(writer); // HERE BE MAGIC!!! mgr.XamlWriterMode = XamlWriterMode.Expression; // THERE WERE MAGIC!!! XamlWriter.Save(element, mgr); String xaml = sb.ToString(); return xaml; } public static FrameworkElement Deserialize(String xaml) { StringReader stringReader = new StringReader(xaml); XmlReader xmlReader = XmlReader.Create(stringReader); FrameworkElement cloned = (FrameworkElement)XamlReader.Load(xmlReader) as FrameworkElement; return cloned; } } }