I used serialization:
string svb = XamlWriter.Save(vb.CloneCurrentValue()); // Replace all "Name" attributes (I don't need them already and deserialization would crash on them) with "Tag" - not best practice but it fast :) svb = svb.Replace("Name", "Tag"); rect.Fill((VisualBrush)XamlReader.Parse(svb));
EDIT
It is best to save Visual as an XPS document and then return Visual. (De) serialization has some problems with SharedSizeGroups and many other "links like".
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); control.InvalidateArrange(); UpdateLayout(); writer.Write(control); Visual capture = doc.GetFixedDocumentSequence().DocumentPaginator.GetPage(0).Visual;
source share