Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 制表符控制深度复制_C#_Visual Studio 2010_Xaml_Tabcontrol_Deep Copy - Fatal编程技术网

C# 制表符控制深度复制

C# 制表符控制深度复制,c#,visual-studio-2010,xaml,tabcontrol,deep-copy,C#,Visual Studio 2010,Xaml,Tabcontrol,Deep Copy,我需要制作tabcontrol的深度副本 大图是这样的:我有一个项目,它有一个300行的XAML代码TabControl,其中有8个相当大的选项卡。我也有一个不同项目的树状视图 当选择该列表中的某个项目时,它将显示与其关联的选项卡控件。现在的问题是,当我添加一个元素时,我想制作一个原始TabControl的深度副本,并将该新元素与新元素关联(当然,我要删除新元素中的内容)。浅拷贝无法工作,因为它们指向内存中的同一位置,所以“=”,IClonable是不可能的。令人沮丧的是,我不能将深度复制与序列

我需要制作tabcontrol的深度副本

大图是这样的:我有一个项目,它有一个300行的XAML代码TabControl,其中有8个相当大的选项卡。我也有一个不同项目的树状视图

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


我已经找了两天了,什么也没找到。我不需要显示代码,因为我正在寻找一种通用的深度复制方法,它可以复制任何类型的TabControl

你做错了

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


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

在搜索了更多代码之后,我最初尝试了一种不同的方法,但结果证明它比它的价值更麻烦(尝试了数据绑定,并在代码中工作了更多,但仍然太多)

因此,解决方案是使用XamlReader和XamlWriter。官方文件已分别找到和

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

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

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

您真的不应该关心300行代码占用了多少“空间”。它不会对应用程序的大小产生太大的影响。另外,请为您的问题添加格式。。例如,一个新段落需要两次“回车”键(回车),使用
Object.MemberwiseClone
如何?上有一个示例显示了使用此方法同时执行浅层复制和深度复制(深度复制基本上在对象上执行MemberwiseClone,然后在任何嵌套引用类型的克隆对象中创建新实例)。Tim我想我尝试过此方法(在这里询问之前,我尝试了10种方法)但将重试。我得到了这个错误:无法通过类型为“System.Windows.Controls.TabControl”的限定符访问受保护的成员“object.MemberwiseClone()”;限定符必须是“Proiect\u Design.Customize\u New”(或从中派生)类型,因此基本上它只允许我对整个窗口进行成员克隆,还是我做错了什么?我还是一个c#初学者。@ChiriacDanAndrei-Yep,看起来它只能应用于整个窗口(除非实现自定义TabControl)。您可以非常简单地做到这一点—只需从
TabControl
继承,然后添加一个DeepCopy方法—然后可以在继承的控件中使用
MemberwiseClone()
。您要做的唯一一件事就是添加DeepCopy方法-其他所有内容都将由base
TabControl
类提供。谢谢!这是一个开始,所以我将研究您建议的模型视图模型。我真的很喜欢这种“自己动手”的回答,因为我不喜欢在学习新事物时走捷径。
string savedTabControl = XamlWriter.Save(originalTabControl);

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