TabControl深层复制

时间:2013-08-12 06:00:18

标签: c# visual-studio-2010 xaml tabcontrol deep-copy

我需要制作一个tabcontrol的深层副本。

大图是这样的:我有一个项目,它有一个300行的XAML代码TabControl,里面有8个标签,非常大。我还有一个包含不同项目的TreeView。

当选择该列表中的项目时,它会显示与之关联的TabControl。现在的问题是,当我添加一个元素时,我想制作原始TabControl的深层副本,并将新的元素与新元素相关联(当然我将删除新元素中的内容)。浅拷贝不起作用,因为它们指向内存中的相同位置,所以“=”,IClonable是不行的。令人沮丧的是,我不能使用序列化的深拷贝,因为TabControl不可序列化。并且我不能(或者应该说不会)创建一个可序列化的自定义TabControl,因为TabControl在XAML中是300行,代码是600行,因此浪费空间和时间。

我已经搜索了2天但没有找到任何东西。我不需要显示代码,因为我正在寻找可以复制任何类型的TabControl的通用Deep Copy方法。

2 个答案:

答案 0 :(得分:0)

你做错了。

你不应该“复制”用户界面或其他任何东西,因为UI is Not Data。您应该操纵和复制数据项而不是UI元素,并且可能使用DataTemplate来在屏幕上显示您的数据项。

我强烈建议您在编写WPF中的单行代码之前研究和学习MVVM。

答案 1 :(得分:0)

在搜索了一些之后,我最初尝试了一种不同的方式,但事实证明它比它的价值更麻烦(尝试使用数据绑定并在代码中工作更多但仍然很多)。

所以解决方案是使用XamlReader和XamlWriter。官方文档分别为herehere

要在代码中回答我的问题,那就是: 假设你在XAML中有这个tabcontrol:

<TabControl>
  <TabItem><!--A lot of stuff here--></TabItem>
  <TabItem><!--More stuff here--></TabItem>
</TabControl>

请记住,如果你有很多东西(基本上我没有提到这个,但我正在创建一个非常复杂的XML接口,所以在TabControl我正在处理大量用户生成的数据) !如果您有一个简单的TabControl,只需在代码中创建一个自定义TabControl或只使用DataBindings。

因此,后台中用于制作该XAML定义的TabControl的深层副本的代码将是:

string savedTabControl = XamlWriter.Save(originalTabControl);

StringReader stringReader = new StringReader(savedTabControl);
XmlReader xmlReader = XmlReader.Create(stringReader);
TabControl newTabControl = (TabControl)XamlReader.Load(xmlReader);

所以这基本上是在xaml控件上进行的序列化,而不是数据。