private static void CopyProperties <T>(T source, T result, Type type) where T : UIElement { // Copy all properties. IEnumerable <PropertyInfo> properties = type.GetRuntimeProperties(); foreach (var property in properties) { if (property.Name != "Name") // do not copy names or we cannot add the clone to the same parent as the original. { if ((property.CanWrite) && (property.CanRead)) { object sourceProperty = property.GetValue(source); UIElement element = sourceProperty as UIElement; if (element != null) { UIElement propertyClone = element.DeepClone(); property.SetValue(result, propertyClone); } else { try { property.SetValue(result, sourceProperty); } catch (Exception ex) { Debug.WriteLine(ex); } } } } } }