Canvas问题

dengkz1 2010-03-15 04:17:25
<Canvas x:Name="a1">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="aa: " />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="bb: " />
</StackPanel>
</StackPanel>
</Canvas>


<Canvas x:Name="a2">

</Canvas>

请问:怎样将a1的内容直接加到a2上
...全文
140 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jv9 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 goldfire_001 的回复:]
引用 4 楼 jv9 的回复:
方法1: 创建Usercontrol,将Canvas2放在Usercontrol中,Canvas1进行调用.<local:xxx></local:xxx>

方法2: 动态载入,将Canvas2作为Children添加到Canvas1中。
canvas1.Children.add(Canvas2)


jv9,方法2,貌似会有问题的哦。同一个eleme……
[/Quote]

我试过方法2,是可行的。 下班后做个例程,我们一起 研究研究~:)
xingjunli 2010-03-18
  • 打赏
  • 举报
回复
推荐方法1: 创建Usercontrol,将Canvas2放在Usercontrol中,Canvas1进行调用.<local:xxx></local:xxx>
自定义用户控件以重用
Goldfire_001 2010-03-18
  • 打赏
  • 举报
回复
OK,我大概做了一个Case。不过是按照我的理解做的,不知道是不是你的意思。嘿嘿。

<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Canvas x:Name="a1">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="aa: " />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="bb: " />
</StackPanel>
</StackPanel>
</Canvas>
<Canvas x:Name="a2" Grid.Column="1">
</Canvas>
<Button x:Name="Clone" Click="Clone_Click" Margin="10,6,10,6" Grid.Row="1" Content="Clone"/>
<Button x:Name="Add" Click="Add_Click" Margin="10,6,10,6" Grid.Row="1" Grid.Column="1" Content="Add Control"/>
</Grid>


private void Clone_Click(object sender, RoutedEventArgs e)
{
//Method 1
foreach (UIElement element in this.a1.Children)
{
//this.a1.Children.Remove(element);
this.a2.Children.Add(element);
}

//Method2
//this.a1.Children.Add(a2);


//Method3
//string result = XamlWriter.Save(this.a1);
//Canvas canvas = XamlReader.Parse(result) as Canvas;
//this.a2.Children.Add(canvas);
}

private void Add_Click(object sender, RoutedEventArgs e)
{
//Add control to canvas a1 in run time.
}

大概是这个意思吧。。

Method1,再没有 Remove语句的情况下会抛exception.

Method2,不是很理解,但是也会抛excetption.(这个可能我理解有问题。)

Method3,是我再做以前一个测试工具的时候就尝试过的。当然,还有些问题。例如Resource啊,之类的,Demo就不做了。不过似乎是可以的哦。

其实这个话题还是一个耐人回味的话题。对于WPF来说,deep clone貌似还有可行的办法,但是Silverlight,由于砍掉了几个关键的类库,我还没有找到太好的办法Clone。

Goldfire_001 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jv9 的回复:]
方法1: 创建Usercontrol,将Canvas2放在Usercontrol中,Canvas1进行调用.<local:xxx></local:xxx>

方法2: 动态载入,将Canvas2作为Children添加到Canvas1中。
canvas1.Children.add(Canvas2)
[/Quote]

jv9,方法2,貌似会有问题的哦。同一个element不能加在两个VisualTree上吧。

应该要把canvas1的childern的依次删掉吧。

个人比较赞同方法一。new出来的东西没有问题啦。

但是如果是Canvas1是动态添加的element,然后在某一时机clone到Canvas2上的话,方法一就不行了。

如果你是WPF,不妨尝试一下这样:

string result = XamlWriter.Save(canvas1);
Canvas canvas2 = XamlReader.Parse(result);
jv9 2010-03-16
  • 打赏
  • 举报
回复
方法1: 创建Usercontrol,将Canvas2放在Usercontrol中,Canvas1进行调用.<local:xxx></local:xxx>

方法2: 动态载入,将Canvas2作为Children添加到Canvas1中。
canvas1.Children.add(Canvas2)
jstangwh 2010-03-16
  • 打赏
  • 举报
回复
楼上思路 正解
dengkz1 2010-03-15
  • 打赏
  • 举报
回复
我是想在a2里也显示a1里的内容
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="aa: " />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="bb: " />
</StackPanel>
</StackPanel>
dengkz1 2010-03-15
  • 打赏
  • 举报
回复
我是a2里也显示
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Margin="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="aa: " />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="bb: " />
</StackPanel>
</StackPanel>
qq124493482 2010-03-15
  • 打赏
  • 举报
回复
visualbrush vb=new visualbrush(a1);
a2.background = vb;

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧