Copy a Xaml object
<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的更多相关文章
- Copy an serializable object deeply
http://www.java2s.com/Tutorial/Java/0100__Class-Definition/Copyanserializableobjectdeeply.htm http:/ ...
- C++ 之 Direct and Copy Forms of Initialization
Extraction from C++ Primer 5th. Editioin 3.2.1 C++ has several different forms of initialization, we ...
- copy 和 strong(或retain)的区别
http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertyn ...
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- Java基础(43):Java中的Object类与其方法(转)
Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...
- Object窥探
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- 每日一“酷”之copy
Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1. 浅副本 copy()创建的浅副 ...
- Class Object
java.lang Class Object java.lang.Object public class Object Class Object is the root of the class hi ...
- java Object类学习
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
随机推荐
- JDK8的Stream操作
原文:https://mp.weixin.qq.com/s/N2zor5RzuHHTHQLHWVBttg 作者:思海同学 好好学java 其他资料:https://mp.weixin.qq.com/ ...
- day12. 闭包
一.概念 """ 如果内函数使用了外函数的局部变量, 并且外函数把内函数返回出来的过程,叫做闭包 里面的内函数是闭包函数 """ 二.基本语 ...
- Java分层领域模型的DO、DTO、BO、AO、VO、POJO、Query定义
分层领域模型: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Data Transfer Object):数据传输对象,Servic ...
- Java异常机制,自定义异常以及spring boot异常设计方案
异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案
- 微信小程序 progress 进度条 内部圆角及内部条渐变色
微信小程序progress进度条内部圆角及渐变色 <view class="progress-box"> <progress percent="80&q ...
- C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...
- Memcached高可用组件之repcached
在前边的tomcat session server msm的那篇博客我们用memcached做tomcat session服务器,默认官方memcached是不支持主从同步的,为了解决memcache ...
- CTF bossplayers 靶机
WAYs: robots.txt文件提供线索,命令执行漏洞获得反弹shell suid命令提升权限 1:netdiscover 发现主机地址192.168.1.109 2:使用namp进行端口扫描发现 ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- SQL Server 异常代码处理
SQL Server使用TRY...CATCH 结构实现TSQL语句的错误处理,TRY命令负责监控语句执行的情况,如果有TSQL语句发生异常,并且严重级别(Severity Level)大于10,并且 ...