1

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

大图是这样的:我有一个项目,它有一个 300 行 XAML 代码 TabControl,其中有 8 个非常大的选项卡。我还有一个包含不同项目的 TreeView。

When an item in that list is selected it shows the TabControl associated with it. 现在问题来了,当我添加一个元素时,我想制作原始 TabControl 的深层副本并将该新元素与新元素相关联(当然我将删除新元素中的内容)。浅拷贝不起作用,因为它们指向内存中的相同位置,所以“=”,IClonable 是不行的。令人沮丧的是,我不能使用带有序列化的深拷贝,因为 TabControl 不可序列化。而且我不能(或者应该说不会)制作一个可序列化的自定义 TabControl,因为 TabControl 在 XAML 中是 300 行,而在代码中它将是 600 行,所以这是浪费空间和时间。

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

4

2 回答 2

0

你做错了。

您不应该“复制” UI 或其他任何内容,因为UI 不是 Data。您应该操作和复制数据项而不是 UI 元素,并且可能使用DataTemplates 将您的数据项显示在屏幕上。

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

于 2013-08-12T16:14:03.693 回答
0

在进行了更多搜索之后,我最初尝试了一种不同的方法,但结果却是麻烦多于其价值(尝试了数据绑定并在代码中进行了更多工作,但仍然很多)。

所以解决方案是使用 XamlReader 和 XamlWriter。官方文档在这里和分别在这里

要在代码中回答我的问题,应该是:假设您在 XAML 中有这个 tabcontrol:

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

请记住,如果您有很多东西(基本上我没有提到这一点,但我正在制作一个创建非常复杂的 XML 的界面,所以在那个 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 控件而不是数据上进行的序列化。

于 2013-08-13T18:19:33.097 回答