Com’è risaputo, WPF ha una capacità di esposizione grafica all’avanguardia ed i controlli possono essere visualizzati con delle libertà mai viste! Ma come facciamo a duplicare un controllo già presente nell’interfaccia grafica?

Il problema si pone perché ad ogni controllo grafico si può associare uno ed un solo genitore, ma se noi volessimo che lo stesso controllo sia duplicato altrove? Riprendendo il post precedente, se volessimo che durante l’operazione di Drag & Drop qualunque sia l’oggetto che abbiamo iniziato a trascinare venga visualizzato attaccato al mouse? Assegnare semplicemente il controllo ad una nuova finestra non è assolutamente permesso!

Ecco quindi un modo per duplicare un oggetto grafico con tutta la gerarchia al di sotto:

private static UIElement cloneElement(UIElement orig)

{

if (orig == null)

return (null);

string s = XamlWriter.Save(orig);

StringReader stringReader = new StringReader(s);

XmlReader xmlReader = XmlTextReader.Create(stringReader, new XmlReaderSettings());

return (UIElement)XamlReader.Load(xmlReader);

}

Per la clonazione si sfrutta quindi la potenza offerta da XAML: non si fa altro che duplicare via codice l’equivalente XAML del controllo e creare un nuovo oggetto grafico su quella base!

Per il post è stato preso spunto da questo thread.