为了澄清我的要求,请查看设计器中的Font属性。单击其下拉列表时,您将获得ForeColor,ImeMode,Language等选项
我想要同样的下拉列表,允许我为我自己添加到设计器的属性输入多个值(它将用于我的自定义控件中的数据库属性,并为您提供选择版本,类型的选项等)。
我该怎么做呢?我看了一遍,我无法找到解决方案。
谢谢。
答案 0 :(得分:6)
您要找的是由TypeConverter
提供的。具体来说,您需要一个ExpandableObjectConverter
- 这会“突破”子属性。我的假类型 - 它是你控制的替身:
Public Class Widget
Public Property Name As String
Public Property FooValue As Integer
Public Property XYOffset As Offset
...
Offset
本身就是一个由三个属性组成的类型:
Public Class Offset
Public Property Name As String
Public Property X As Int32
Public Property Y As Int32
...
Public Overrides Function ToString() As String
Return String.Format("{0}: ({1}, {2})", Name, X.ToString, Y.ToString)
End Function
如果不清楚,Widget
将成为您的控制,XYOffset
将是您要询问的财产。 ToString()
覆盖是为了让您在属性网格中找不到丑陋的类型名称(WindowsApplication14.SomeType
)。 PropertyGrid控件中的结果:
它被禁用,因为NET不知道如何编辑Offset
对象。这只需要一个最简单的TypeConverters
:
Public Class XYOffsetConverter
Inherits ExpandableObjectConverter
' more to come
End Class
装饰物业:
Public Class Offset
...
<TypeConverter(GetType(XYOffsetConverter))>
Public Property XYOffset As Offset
Offset
属性可以使用:<TypeConverter(GetType(ExpandableObjectConverter))>
但是由于您提到这是一个CustomControl,您稍后将需要TypeConverter
中的其他功能(请参阅注释)。结果是核心功能几乎没有工作:
由于NET 知道如何修改String
和Int32
,因此编辑可以处理打开的属性。缺少两件事:
a)在编辑子属性时,Offset
属性“摘要”不会更新(X
在图像中不匹配)
b)用户无法编辑顶部的“摘要”字符串来更改属性。
修复第一个很容易。只需向Offset
属性添加属性:
Public Class Offset
<NotifyParentProperty(True)>
Public Property Name As String
<NotifyParentProperty(True)>
Public Property X As Int32
<NotifyParentProperty(True)>
Public Property Y As Int32
现在,每个子属性编辑后的摘要更新:
修复B并不难 - 您只需要解析在ToString()
中创建的字符串并从中返回一个新的偏移量。然而,它没有必要,只是很好,因为他们可以打开它并编辑每个值。
另一件事是它取决于那些东西是什么,我不想猜你的类型(类)是什么样的。大多数TypeConverters
都是特定类型的,我不知道你的样子。
我在示例中使用了属性网格,但控件在VS属性窗口中的工作方式相同。
注意强>
你表示这是一个自定义控件。在这种情况下,您需要帮助VS序列化您的类型,因为它不知道如何创建在设计器中创建的Offset
类型。这是TypeConverter
的另一项工作。我只是不知道你的样子。
答案 1 :(得分:1)
您可以将TypeConverterAttribute
与System.ComponentModel.ExpandableObjectConverter
类一起用作参数。
该属性会将您的类转换为设计者支持的“下拉”属性。
示例代码:
Imports System.ComponentModel
<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))>
Public Class MyPropertyClass
Public Property Name As String
Public Property Value As Integer
End Class
在您的课程中将包含该属性:
<Browsable(True)> _
Public Property MyProperty As New MyPropertyClass