WPF中Canvas的复制
答案:2 悬赏:70
解决时间 2021-03-12 23:43
- 提问者网友:傀儡离开
- 2021-03-12 02:29
转换了一些矢量图为Xaml格式,根节点就是Canvas
用XamlReader.Load(path) 然后放入Panel
如果要在Panel中显示两次,就会提示此对象已有父对象什么的,要先断开连接
断开连接我也不会...
目前只能靠再读取Xaml文件实现复制
如果一次要显示200相同的矢量图标,岂不是要读200次??
怎么办?去继承Canvas实现克隆的接口?
有更方便的方法吗
我放在这里面行不行
最佳答案
- 二级知识专家网友:心与口不同
- 2021-03-12 03:36
使用 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.
全部回答
- 1楼网友:晚安听书人
- 2021-03-12 04:50
使用 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 定义为一种资源:
<window .........> // 这里省略号表示省略了一些内容(例如 xmlns)
<window.resources>
<controltemplate x:key="mycanvas">
<canvas>
<image source="abc.png"/>
<!-- 这里不知道楼主是怎么写的,但不重要,因为它是 canvas 的子元素 -->
</canvas>
</controltemplate>
</window.resources>
<grid x:name="layoutroot">
<!-- 我们要在这个 grid 放置 200 个 定义在资源中的 canvas -->
</grid>
</window>
下面是后台的逻辑 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.
我要举报
大家都在看
推荐资讯