Vb.Net设置用户控件属性

标签 vb.net properties

我有一个自定义用户控件,我希望从设计器中设置它的一些属性。这些属性将来自结构。这是当前代码

Private fooList As Foo_structure

    Public Structure Foo_structure
        Public Property a As Integer
        Public Property b As Integer
        Public Property c As Extras
    End Structure

    Public Structure Extras
        Public Property precision As Integer
        Public Property light As String
    End Structure

    Public Property foo As Foo_structure
        Get
            Return fooList
        End Get
        Set(ByVal value As Foo_structure)
            fooList = value
        End Set
    End Property

我需要能够从设计器属性面板设置 Foo_struct 的属性,如下图所示。

example

最佳答案

您将需要 TypeConverter将 foo 折叠成字符串;并从中转换回来。嵌套的 Type 意味着您需要为 Extras 编写另一个类型。 。您可能需要使用一些属性来处理设计器持久性。

首先,我认为你至少需要将 Foo_struct 更改为 Class,否则无法向实例添加代码 Extras (也无法创建 Foo 实例)。这应该可以帮助您开始(更改了一些名称):

' Foo converted to Class:
<TypeConverter("FooItemConverter")>
Public Class FooBar
    <DefaultValue(0)>
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    Public Property Foo As Integer

    <DefaultValue(0)>
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    Public Property Bar As Integer

   <EditorBrowsable(EditorBrowsableState.Always)>
   <NotifyParentProperty(True)>
   <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    Public Property Ex As Extras

    Public Sub New(a1 As Integer, b2 As Integer)
        Foo = a1
        Bar = b2
        Ex = New Extras    ' do not want NOTHING flying about
    End Sub

End Class

DefaultValue并没有做你可能认为它会做的事情。当当前值不等于默认值时,它告诉 IDE 序列化属性的值。 DesignerSerializationVisibility告诉 VS 保存属性的值。 Foo 和 Bar 都需要这些。

Ex/Extra 是不同的。 NotifyParentProperty允许 FooBar 在 Extra 属性值发生更改时收到通知,以便更新 IDE 窗口、设置内部“DirtyFlag”等; DesignerSerializationVisibility.Content告诉 VS 我们知道我们不能将 Ex 保存为值,因此保存内容。

然后是 FooItemConverter。这将在 Props 窗口中显示您想要的字符串并从该字符串创建 Foo 项目:

Friend Class FooItemConverter
   Inherits ExpandableObjectConverter

   ' tells the IDE what conversions it can handle:
    Public Overrides Function CanConvertTo(context As ITypeDescriptorContext,
                                              destType As Type) As Boolean
        If destType = GetType(String) Then
            ' Yes I Can
            Return True
        End If
        ' Probably have to also say YES to an InstanceDescriptor 
        Return MyBase.CanConvertTo(context, destType)
    End Function

之后是ConvertTo函数用于将 foo 转换为字符串。像这样的事情:

Public Overrides Function ConvertTo(context As ITypeDescriptorContext,
                                culture As Globalization.CultureInfo,
                                value As Object, destType As Type) As Object
    If destType = GetType(String) Then

        Dim f As FooBar = CType(value, FooBar)
        Return String.Format("{0}, {1}, {2}", 
                f.foo.ToString, 
                f.bar.ToString, 
                f.Ex.ToString)

       ' outputs: X, Y, <ex>
       ' where Ex is what we use in the ExtraItemConverter

    End If

    Return MyBase.ConvertTo(context, destType)
End Function

如果ExtraItemConverter.ConvertTo使用格式 "({0} / {1})"那么控件内容将显示为:F, B, (P / L)其中 F=Foo,B=Bar 等。

要使其工作,您需要 4 个过程:CanConvertTo、ConvertTo、CanConvertFrom、ConvertFrom 都响应字符串。您可能将能够仅使用 <DefaultValue>持久性属性。

FooItemConverter.ConvertFrom必须知道如何从该字符串创建一个对象。通常,这样做是这样的:

' parse the string you made and create a Foo
Dim els As String() = str.Split(","c)
Return New myFoo(Convert.ToInt32(els(0)), Convert.ToInt32(els(1)))

请注意,第三个元素被忽略,因为它实际上是 ExtraItemConverter处理。该转换器非常相似。

因此,您首先必须决定是坚持结构还是使用类(类的另一个优点是您找到的 99.999% 的示例都是基于类的)。 These guys了解很多TypeConverters .

关于Vb.Net设置用户控件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24241527/

相关文章:

vb.net - 本地化 Windows 窗体

java - 从 System.getProperties() 将属性合并到 ResourceBundle

c# - 我应该创建很多 PropertyChangedEventHandler 还是测试 PropertyChangedEventArgs?

wpf - 当文本框中未填写任何内容时,将 null 设置为 mvvm WPF 中的属性

windows - 每当计算机锁定时让屏幕保护程序启动?

vb.net - 如何在 vb.net 中引用另一个类中的类变量

vb.net - 从 vb.net 中的数据库中删除后,在运行时从组合框中删除 id

.net - GroupBy 来自日期时间变量的日期

javascript - 如何在 JavaScript 对象文字中使用变量作为键?

c# - VB 到 C# 属性到 int 转换的转换