创建具有可浏览、可扩展字段的 属性
Creating a Property with Browsable, Expandable Fields
要弄清楚我在问什么,请查看设计器中的字体 属性。当你点击它的下拉菜单时,你会得到 ForeColor、ImeMode、Language 等选项。
我想要相同类型的下拉列表,允许我为我自己添加到设计器的 属性 输入多个值(它将用于我的自定义控件中的数据库 属性并为您提供 select 版本、类型等选项)。
我该怎么做?我找遍了都找不到解决办法。
谢谢。
您可以使用 TypeConverterAttribute
和 System.ComponentModel.ExpandableObjectConverter
class 作为参数。
该属性会将您的 class 转换为设计师支持的 "drop down" 属性。
示例代码:
Imports System.ComponentModel
<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))>
Public Class MyPropertyClass
Public Property Name As String
Public Property Value As Integer
End Class
并且在您的 class 中将包含 属性:
<Browsable(True)> _
Public Property MyProperty As New MyPropertyClass
结果:
您要找的是 TypeConverter
提供的。具体来说,您需要一个 ExpandableObjectConverter
- 这个 "breaks out" child 属性。我的假类型 - 这是一个 stand-in 供您控制:
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
)。 属性网格控件中的结果:
它已被禁用,因为 NET 不知道如何编辑 Offset
object。这只需要最简单的 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) 当您编辑 child 属性时,Offset
属性 "summary" 不会更新(X
不匹配图片)
b) 用户无法编辑顶部 'summary' 字符串来更改属性。
修复第一个问题很容易。只需在 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
现在,摘要会在每次 child 属性 编辑后更新:
修复 B 并不难 - 您只需要解析您在 ToString()
中创建的字符串并从中 return 一个新的偏移量。然而,这不是必需的,很好,因为他们可以打开它并编辑每个值。
另一件事是它取决于那些东西是什么,我不想猜测你的类型 (Class) 是什么样子。大多数 TypeConverters
是 type-specific,我不知道你的长什么样。
我在示例中使用了 属性 网格,但控件在 VS 中的工作方式相同 属性 window.
备注
您指出这是针对自定义控件的。在这种情况下,您将需要帮助 VS 序列化您的类型,因为它不知道如何创建在设计器中创建的 Offset
类型。这是您 TypeConverter
的另一份工作。就是不知道你长什么样
要弄清楚我在问什么,请查看设计器中的字体 属性。当你点击它的下拉菜单时,你会得到 ForeColor、ImeMode、Language 等选项。
我想要相同类型的下拉列表,允许我为我自己添加到设计器的 属性 输入多个值(它将用于我的自定义控件中的数据库 属性并为您提供 select 版本、类型等选项)。
我该怎么做?我找遍了都找不到解决办法。
谢谢。
您可以使用 TypeConverterAttribute
和 System.ComponentModel.ExpandableObjectConverter
class 作为参数。
该属性会将您的 class 转换为设计师支持的 "drop down" 属性。
示例代码:
Imports System.ComponentModel
<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))>
Public Class MyPropertyClass
Public Property Name As String
Public Property Value As Integer
End Class
并且在您的 class 中将包含 属性:
<Browsable(True)> _
Public Property MyProperty As New MyPropertyClass
结果:
您要找的是 TypeConverter
提供的。具体来说,您需要一个 ExpandableObjectConverter
- 这个 "breaks out" child 属性。我的假类型 - 这是一个 stand-in 供您控制:
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
)。 属性网格控件中的结果:
它已被禁用,因为 NET 不知道如何编辑 Offset
object。这只需要最简单的 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) 当您编辑 child 属性时,Offset
属性 "summary" 不会更新(X
不匹配图片)
b) 用户无法编辑顶部 'summary' 字符串来更改属性。
修复第一个问题很容易。只需在 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
现在,摘要会在每次 child 属性 编辑后更新:
修复 B 并不难 - 您只需要解析您在 ToString()
中创建的字符串并从中 return 一个新的偏移量。然而,这不是必需的,很好,因为他们可以打开它并编辑每个值。
另一件事是它取决于那些东西是什么,我不想猜测你的类型 (Class) 是什么样子。大多数 TypeConverters
是 type-specific,我不知道你的长什么样。
我在示例中使用了 属性 网格,但控件在 VS 中的工作方式相同 属性 window.
备注
您指出这是针对自定义控件的。在这种情况下,您将需要帮助 VS 序列化您的类型,因为它不知道如何创建在设计器中创建的 Offset
类型。这是您 TypeConverter
的另一份工作。就是不知道你长什么样