【发布时间】:2014-06-01 22:24:11
【问题描述】:
我制作了一个新的 WinForms 控件
Public Class jwGraph
Inherits Control
这个控件中有BindingLists(Of Foo)。为了避免与序列化有关的其他 Visual Studio 错误(错误消息),我将Serializable 属性添加到Foo,并将其他一些标签添加到BindingList(Of Foo)。
例子:
Foo 声明
<Serializable> _
Public Class FreeMarker
Bindinglist(Of Foo) 声明:
<System.ComponentModel.Browsable(False)>
<EditorBrowsable(EditorBrowsableState.Never)>
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)>
Public WithEvents FreeMarkers As BindingList(Of FreeMarker)
当我使用我的控件时,Visual Studio 会将 base64 数据资源添加到表单的 resx 文件和类似的行
Me.JwGraph1.FreeMarkers = CType(resources.GetObject("JwGraph1.FreeMarkers"), System.ComponentModel.BindingList(Of jwToolLib.jwGraph.FreeMarker))
给设计师。这样做的问题是,在此之后我无法以任何方式更改控件代码中的任何内容(或更改程序集),因为这样反序列化将失败,我必须竭尽全力让它再次运行全部。
许多控件使用集合。我似乎找不到他们的实现(我尝试查看反射器中的基本控件)和我的实现之间的区别,但他们的集合并没有以任何这种方式出现在设计器中。
那么如何防止在设计时将集合生成为二进制资源? 它们在控件的构造函数中初始化。
我的代码在 VB.net 中,但也非常欢迎使用 C# 回答。
【问题讨论】:
-
您的
FreeMarkers属性需要可序列化/序列化:并且FreeMarker可能也需要一些工作。在设计时如何将需要序列化的东西添加到其中?
标签: c# vb.net visual-studio-2012 serialization windows-forms-designer