我制作了一个新的 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# 提供答案。
最佳答案
像往常一样,连续3个小时白发,然后决定询问,迅速找到解决方案:
如此处所述http://msdn.microsoft.com/en-us/library/53b8022e%28v=VS.100%29.aspx您可以在代码中添加 ShouldSerialize[...]
函数以防止特定字段被序列化。我猜设计师会评估这些功能,然后决定做什么。
为了与上面的示例保持一致:
除了
<System.ComponentModel.Browsable(False)>
<EditorBrowsable(EditorBrowsableState.Never)>
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)>
Public WithEvents FreeMarkers As BindingList(Of FreeMarker)
向您的类添加两个函数:
Public Function ShouldSerializeFreeMarkers() As Boolean
Return False
End Function
Public Sub ResetFreeMarkers()
Series = Nothing
End Sub
你瞧:不再需要设计时序列化。
关于c# - VS Designer中的自定义控件: Avoid serialization of Collection properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985139/