【发布时间】:2015-08-18 11:12:50
【问题描述】:
我有一个带有Foo 类型属性的自定义控件。我为这个类创建了一个UITypeEditor。
这很有效,并导致设计器代码如下:
Dim Foo1 As PropertySerialization.Foo = New PropertySerialization.Foo()
Me.FooControl1 = New PropertySerialization.FooControl()
Me.SuspendLayout()
'
'FooControl1
'
Me.FooControl1.Location = New System.Drawing.Point(35, 56)
Me.FooControl1.Name = "FooControl1"
Me.FooControl1.Size = New System.Drawing.Size(188, 136)
Foo1.A = 3
Foo1.B = "World"
Me.FooControl1.Something = Foo1
Me.FooControl1.TabIndex = 0
Me.FooControl1.Text = "FooControl1"
Something 属性的类型为 Foo,如您所见,设计师明确创建了一个新对象 Foo1。
我的问题是:我可以告诉设计者宁愿使用 With 关键字内联创建 foo 对象,例如:
'
'FooControl1
'
Me.FooControl1.Location = New System.Drawing.Point(35, 56)
Me.FooControl1.Name = "FooControl1"
Me.FooControl1.Size = New System.Drawing.Size(188, 136)
Me.FooControl1.Something = New Foo() With {.A = 3, .B = "World"}
Me.FooControl1.TabIndex = 0
Me.FooControl1.Text = "FooControl1"
当要创建更复杂的类型时,我希望这样可以避免设计器文件中的混乱。
非常感谢 C# 或 VB.NET 中的答案。
【问题讨论】:
-
一个类型转换器会让你在那儿走得更远。设计师序列化是 VS 的工作,它会按照自己认为合适的方式进行。您可能至少可以使用 ctor 重载
-
确实如此。我已经实现了这个(但在这个例子中废弃了它)但我遇到了问题,VS 然后 only 使用了构造函数并忽略了任何其他属性。不过,这可能是一个实施问题,因为我不太熟悉这些方式。
-
InstanceDescriptor的最终 True/False 表示是否还有更多的 props 需要序列化 -
哦,我忽略了这一点。谢谢,我会再检查一遍
-
它仍然会创建一个显式的临时变量,所以它只会让你分道扬镳,其他道具上的
DesignerSerializationVisibility设置也可能是一个因素
标签: .net vb.net visual-studio windows-forms-designer typeconverter