我需要做一个表控的深拷贝。
大图是这样的:我有一个项目,它有一个300行的XAML代码TabControl,其中有8个选项卡,非常大。我也有一个TreeView与不同的项目。
当选择该列表中的项时,它将显示与其关联的TabControl。现在的问题是,当我添加一个元素时,我想要对原始TabControl进行深度复制,并将该新元素与新元素相关联(当然,我将删除新元素中的内容)。浅拷贝不能工作,因为它们指向内存中相同的位置,所以"=",IClonable是拒绝的。令人沮丧的是,我不能使用深度复制和序列化,因为TabControl是不可序列化的。我不能(或者应该说不会)做一个定制的TabControl,它是可序列化的,因为TabControl在XAML中是300行,在代码中是600行,所以这是浪费空间和时间。
我已经找了两天了,什么也没找到。我不需要显示代码,因为我正在寻找一个通用的深度复制方法,它可以复制任何类型的TabControl。
发布于 2013-08-13 18:19:33
在进行了更多的搜索之后,我最初尝试了一种不同的方法,但结果发现这比它更有价值(尝试过数据绑定,在代码中工作得更多,但仍然很麻烦)。
因此,解决方案是使用XamlReader和XamlWriter。官方文档分别是这里和这里!
要用代码回答我的问题,应该是:假设在XAML中有这个表控件:
<TabControl>
<TabItem><!--A lot of stuff here--></TabItem>
<TabItem><!--More stuff here--></TabItem>
</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控件上进行的序列化,而不是对数据的序列化。
发布于 2013-08-12 16:14:03
你这么做完全不对。
您不应该“复制”UI或其他任何东西,因为UI不是数据。您应该操作和复制数据项,而不是UI元素,并且可能使用DataTemplate在屏幕上表示数据项。
我强烈建议您在用WPF编写一行代码之前研究和学习MVVM。
https://stackoverflow.com/questions/18180430
复制相似问题