2016-07-29 75 views
-1

我尝试深入复制ToolStripMenuItems以将副本添加到不同的其他ToolStripMenu。有没有办法深入复制Winforms控件?

当我试图序列它返回Nothing(4号线在下面的代码)并没有作出这样的ToolStripMenuItem的新实例的ToolStripMenuItem。

Public Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function DeepCopy(Of T)(ByVal Obj As T) As T 
     If Obj.GetType().IsSerializable = False Then Return Nothing 

     Using MStream As New MemoryStream 
      Dim Formatter As New BinaryFormatter 
      Formatter.Serialize(MStream, Obj) 
      MStream.Position = 0 
      Return DirectCast(Formatter.Deserialize(MStream), T) 
     End Using 
    End Function 
End Module 

我的副本

Dim tsmiCopy As ToolStripMenuItem = tsmiOriginal.DeepCopy() 
+0

这是这一行:'如果Obj.GetType()IsSerializable = false,那么返回Nothing'返回'Nothing'。如果您要删除该行,您将得到一个异常,指出组件不可序列化。 –

+1

查看您的designer.cs文件的代码。只需复制这些代码并将它们放入方法中,并在需要工具条的克隆副本时调用该方法,请参阅@SuperPeanut答案。 –

回答

2

没有WinForm控件是序列化的,至于原因,他们都随身携带一个句柄活跃窗口,根据定义,它与序列化不兼容。

所以你必须找到周围的另一种方式。我的建议是创建一个函数来构建一个全新的MenuItems,并随时在表单上需要时调用它。

为此,您可以在Designer中创建菜单,然后打开文件“MyForm.Designer.vb”并复制创建菜单的部分,然后将其放入函数中。

1

正确的序列化要求的内部(私有成员)的知识,使状态能够恢复,这样才能真正由给定类型本身来完成。因此,如果给定类型不可序列化,则需要以不同方式解决更广泛的问题,或解决此问题(可能通过执行MemberwiseClone),这可能会破坏深克隆的定义。

相关问题