<Control.Resources>
<Button Click="Button_OnClick" x:Key="MyButton">
<Border Margin="10" CornerRadius="4" Background="White" Width="200" Height="200">
<Grid>
<StackPanel VerticalAlignment="Top">
<Border Height="100" Margin="0,10,0,0">
<Border.Background>
<ImageBrush ImageSource="/DefenseTest;component/Resources/123.png" Stretch="Uniform"/>
</Border.Background>
</Border>
<TextBlock Name="MyText" HorizontalAlignment="Center" Text="test"></TextBlock>
</StackPanel>
</Grid>
</Border>
</Button>
</Control.Resources>

然后

Button button =(Button)Resources["MyButton"];
Button button2=button.XamlClone();

你并不能直接多次(Button)Resources["MyButton"];会是同一个引用

所以需要clone下

public static class ExtensionMethods
{
public static T XamlClone<T>(this T original)
where T : class
{
if (original == null)
return null; object clone;
using (var stream = new MemoryStream())
{
XamlWriter.Save(original, stream);
stream.Seek(0, SeekOrigin.Begin);
clone = XamlReader.Load(stream);
} if (clone is T)
return (T)clone;
else
return null;
}
}

https://msdn.microsoft.com/en-us/library/ms754193.aspx

但是这种方法有弊端,只能用来保存点文本和图形数据

里面的eventhandler,资源uri,,binding都会没,有的资源会形成一个自己的component,不再是引用的资源了

另外copy的对象不是一开是xaml里写好的,因为中途可能改动了,或者被优化了,然后save的就缺失了部分,也包括事件处理这些,因为序列化是被限制为逻辑树中自包含,没有可以保存事件处理的设施

我们可以通过contentcontrol来存资源

<Control.Resources>
<DataTemplate x:Key="MyButton">
<Button Click="Button_OnClick">
<Border Margin="10" CornerRadius="4" Background="White" Width="200" Height="200">
<Grid>
<StackPanel VerticalAlignment="Top">
<Border Height="100" Margin="0,10,0,0">
<Border.Background>
<ImageBrush ImageSource="/DefenseTest;component/Resources/123.png" Stretch="Uniform"/>
</Border.Background>
</Border>
<TextBlock Name="MyText" HorizontalAlignment="Center" Text="test"></TextBlock>
</StackPanel>
</Grid>
</Border>
</Button>
</DataTemplate>
</Control.Resources>

这个就可以多次创建模板了

ContentControl content=new ContentControl();
content.ContentTemplate = (DataTemplate)FindResource("MyButton");
content.Loaded += (s, e) =>
{
var textBlock = MyVisualTreeHelper.FindVisualChildItem<TextBlock>((ContentControl) content, "MyText");
textBlock.Text = "test";
};
public static ChildItem FindVisualChildItem<ChildItem>(DependencyObject obj, string name) where ChildItem : FrameworkElement
{
if (null != obj)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is ChildItem && (child as ChildItem).Name.Equals(name))
{
return (ChildItem)child;
}
else
{
ChildItem childOfChild = FindVisualChildItem<ChildItem>(child, name);
if (childOfChild != null && childOfChild is ChildItem && (childOfChild as ChildItem).Name.Equals(name))
{
return childOfChild;
}
}
}
}
return null;
}

Copy a Xaml object的更多相关文章

  1. Copy an serializable object deeply

    http://www.java2s.com/Tutorial/Java/0100__Class-Definition/Copyanserializableobjectdeeply.htm http:/ ...

  2. C++ 之 Direct and Copy Forms of Initialization

    Extraction from C++ Primer 5th. Editioin 3.2.1 C++ has several different forms of initialization, we ...

  3. copy 和 strong(或retain)的区别

    http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertyn ...

  4. property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  5. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  6. Object窥探

    /* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...

  7. 每日一“酷”之copy

    Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1.  浅副本 copy()创建的浅副 ...

  8. Class Object

    java.lang Class Object java.lang.Object public class Object Class Object is the root of the class hi ...

  9. java Object类学习

    /* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...

随机推荐

  1. Linux下 flash工具的使用

    使用命令前用cat /proc/mtd 查看一下mtdchar字符设备:或者用ls -l /dev/mtd* #cat /proc/mtd dev:    size   erasesize  name ...

  2. 在Linux系统中安装Tomcat详细教程

    首先在官网下载jdk和Tomcat的压缩包 这里下载jdk-8u241-linux-x64 .tar.gz 和apache-tomcat-8.5.50.tar.gz 然后解压jdk压缩包 tar –z ...

  3. windows系统下python setup.py install ---出现cl问题,cpp_extension.py:237: UserWarning: Error checking compiler version for cl: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte

    将cpp_extension.py文件中的 原始的是   compiler_info.decode() try: if sys.platform.startswith('linux'): minimu ...

  4. 2020-05-14:实现分布式Session的过程是怎样的?

    福哥答案2020-05-14: 此答案来自群员:分布式session ,最开始起源是双机热备,当时php1和php2为了共享session,一开始采用samba/nfs,后来php有了插件以后就扔当时 ...

  5. C#算法设计排序篇之06-堆排序(附带动画演示程序)

    堆排序(Heap Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/685 访问. 堆排序是指利用堆积树(堆)这 ...

  6. 提前批笔试一道算法题的Java实现

    题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...

  7. Vue 如何优雅的根据条件动态显示组件

    常规情况下,在里动态加载不同组件的方式为: <template> <!-- 符合条件A,加载组件A --> <BusinessComponentA v-if=" ...

  8. 运用cookie实现记住密码自动登陆:

    苦命的程序员:只有博客才能了解我的路!!! 废话不多说:直接上代码: 1.首先在现在登录的页面上来获取cookie的所有: 2.在验证页面来设置clookie的用户名和密码还有是否是自动登录: 到此就 ...

  9. 设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别

    0.背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们 ...

  10. 使用动态链接为什么还需要静态库lib文件

    在Windows上使用动态链接时,不光需要头文件 .dll文件 还需要一个.lib 文件. 不是动态链接吗?为什么还需要静态库.lib文件? 实际上,这个.lib文件并不是静态库,而是 导入库 文件, ...