【问题标题】:Custom Control in VS Designer: Avoid serialization of Collection propertiesVS Designer 中的自定义控件:避免集合属性的序列化
【发布时间】: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


【解决方案1】:

像往常一样,连续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

你瞧:不再有设计时序列化。

【讨论】:

  • 如果您希望它们序列化并忘记某些步骤,也会发生同样的事情,这就是我认为您遇到的问题。我认为你不需要 ShouldXXXResetXXXDesignerSerializationVisibility.Hidden 这真的意味着忽略。
  • 我尝试了所有与 Designerserialization 属性的组合,但效果不大。即使隐藏,也执行了序列化。我不明白。但至少它适用于函数,即使它并不漂亮。
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多