创建具有可浏览、可扩展字段的 属性

Creating a Property with Browsable, Expandable Fields

要弄清楚我在问什么,请查看设计器中的字体 属性。当你点击它的下拉菜单时,你会得到 ForeColor、ImeMode、Language 等选项。

我想要相同类型的下拉列表,允许我为我自己添加到设计器的 属性 输入多个值(它将用于我的自定义控件中的数据库 属性并为您提供 select 版本、类型等选项)。

我该怎么做?我找遍了都找不到解决办法。

谢谢。

您可以使用 TypeConverterAttributeSystem.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 确实 知道如何编辑 StringInt32 后,编辑就可以在打开的属性上工作。它缺少两件事:
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 的另一份工作。就是不知道你长什么样