中易网

WPF中Canvas的复制

答案:2  悬赏:70  
解决时间 2021-03-12 23:43
转换了一些矢量图为Xaml格式,根节点就是Canvas
用XamlReader.Load(path) 然后放入Panel
如果要在Panel中显示两次,就会提示此对象已有父对象什么的,要先断开连接
断开连接我也不会...
目前只能靠再读取Xaml文件实现复制

如果一次要显示200相同的矢量图标,岂不是要读200次??
怎么办?去继承Canvas实现克隆的接口?
有更方便的方法吗
我放在这里面行不行


//......
引用的时候 这句
Canvas icon = Application.Resources["icon"] as Canvas;

非静态字段、方法或属性“System.Windows.Application.Resources.get”要求对象引用

还有因为有这句所以换成Canvas icon = App.Resources["icon"] as Canvas;
也一样不行...
最佳答案
使用 XamlReader 和 XamlWrite 是可以复用一个 UIElement.
但在保存时最好指定 xmlns. 另外, 如果将要复用的 UIElement (例如 Canvas) 定义为一种 Resource, 则只能添加一次,否则,出现:
Specified Visual is already a child of another Visual or the root of a CompositionTarget.
这种错误.

但我给个方便的例子,不用 xaml Reader/Writer 来完成对 UIElement 或 FrameworkElement 的复制/重用:

楼主是用 Canvas, 然后在 Canvas 里放一些矢量图(其实放什么不重要),然后显示 200 个这样的 Canvas, 那好,将这个 原始的 Canvas 定义为一种资源:
// 这里省略号表示省略了一些内容(例如 xmlns)
















下面是后台的逻辑 code:
怎么触发自己设置
void Display200Canvas()
{
for(int i=0; i<200; i++)
{
Control ctrl=new Control();
ctrl.Template = Window.Resources["myCanvas"] As ControlTemplate;
// 这里设置一下 ctrl 的位置, 不要重叠就可以了,怎么设置就略去了
// .....
LayoutRoot.Children.Add(ctrl);
}
}

完成~
主要是利用 Control 控件加载 ControlTemplate, 而 这个 ControlTemplate 就是你所要显示的东西,它作为 xaml 中的 资源 定义在 ControlTemplate 元素中.
实际上这并不限是 Canvas.
全部回答
使用 xamlreader 和 xamlwrite 是可以复用一个 uielement. 但在保存时最好指定 xmlns. 另外, 如果将要复用的 uielement (例如 canvas) 定义为一种 resource, 则只能添加一次,否则,出现: specified visual is already a child of another visual or the root of a compositiontarget. 这种错误. 但我给个方便的例子,不用 xaml reader/writer 来完成对 uielement 或 frameworkelement 的复制/重用: 楼主是用 canvas, 然后在 canvas 里放一些矢量图(其实放什么不重要),然后显示 200 个这样的 canvas, 那好,将这个 原始的 canvas 定义为一种资源: &lt;window .........&gt; // 这里省略号表示省略了一些内容(例如 xmlns) &lt;window.resources&gt; &lt;controltemplate x:key="mycanvas"&gt; &lt;canvas&gt; &lt;image source="abc.png"/&gt; &lt;!-- 这里不知道楼主是怎么写的,但不重要,因为它是 canvas 的子元素 --&gt; &lt;/canvas&gt; &lt;/controltemplate&gt; &lt;/window.resources&gt; &lt;grid x:name="layoutroot"&gt; &lt;!-- 我们要在这个 grid 放置 200 个 定义在资源中的 canvas --&gt; &lt;/grid&gt; &lt;/window&gt; 下面是后台的逻辑 code: 怎么触发自己设置 void display200canvas() { for(int i=0; i&lt;200; i++) { control ctrl=new control(); ctrl.template = window.resources["mycanvas"] as controltemplate; // 这里设置一下 ctrl 的位置, 不要重叠就可以了,怎么设置就略去了 // ..... layoutroot.children.add(ctrl); } } 完成~ 主要是利用 control 控件加载 controltemplate, 而 这个 controltemplate 就是你所要显示的东西,它作为 xaml 中的 资源 定义在 controltemplate 元素中. 实际上这并不限是 canvas.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
去劳动仲裁说公司乱扣工作服押金,做满一年辞
丝丝美发艺地址在哪,我要去那里办事
昨晚梦见和一个人在吵架(就在我从小生活的地
LOL现在还有狂徒铠甲吗?那振奋呢?
飞机 上的五角星代表什么
铝材加工会出现哪些常见的问题?
这个是谁对x求导?f(x)还是f(cos√x)
我公公胃病做完手术2个月了,但是身体一直不
丽颜美容养生馆地址有知道的么?有点事想过去
怎么样才能有个漂亮又贤惠可爱的女朋友?
丽水市桑迪汽车维修中心在哪里啊,我有事要去
哪里能买到卡西欧ct-588电子琴的电源线?
隔离器变压器隔离方式与光藕隔离方式哪个好啊
102 15kv的电容能用什么型号的代替
兰州马家牛肉拉面这个地址在什么地方,我要处
推荐资讯
易佰良品酒店南汇大学城店怎么去啊,有知道地
极品飞车9打开后没显示进程里~e5.0001怎么回
水洗棉和纯棉的区别 水洗棉和纯棉哪个更好
8.20是什么星座?
晨光文具小皇帝平价超市店地址在哪,我要去那
想知道:重庆市 从双福镇到巴福怎么坐公交?
LK数码生活馆地址在哪,我要去那里办事
推荐高达SEED DESTINY中精彩的几集(不想全看
虞城县小侯派出所怎么去啊,有知道地址的么
sin60°tan135°+cos(-30°)解析式
联想笔记本电脑安装W7家庭普通版后自带的软件
安达健身会巨星店地址在哪,我要去那里办事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?