.NET用户控件 - 带下拉列表的子类?

时间:2016-08-09 21:56:43

标签: .net vb.net user-controls

我正在控制,但我遇到了问题。

现在它可以正常运行,例如:

Public Class CircularProgressBar : Inherits UserControl
Private _barWidth As Integer = 4
Public Property BarWidth() As Integer
    Get
        Return _barWidth
    End Get
    Set(ByVal v As Integer)
        _barWidth = v : Invalidate()
    End Set
End Property

..etc
End Class

以上例如将在属性窗口中显示正常。但是,我希望在同一个控件中显示1-5个条形,如果我只是定义了一个数组/列表或者做了_barWidth1,_barWidth2等,它会正常工作。但显然有更多的值然后只是宽度而且它看起来很难看在属性页面中。

我想要一个像DROPDOWN一样的东西,所以我考虑添加一个类,即。

Public Class CircularProgressBar : Inherits UserControl
    Public Class BarTest
     ....subclasscode
    End Class
..Class Code
End Class

但是,值的下拉列表不会出现。如果我做公共类BarTest它们也会这样做:继承UserControl,但它带来了大量不需要的值。我需要的是一些方法来获得下拉,但不是所有额外的东西都可以用来控制用户控件。我可能错过了很小的东西。

谢谢!

1 个答案:

答案 0 :(得分:1)

目前还不完全清楚正在编辑/保存的是什么或者这些是什么 - 因为你在谈论一个属性编辑器,它们的性质是有些重要的。

UIType编辑器不是一种风格选择。 VS会根据Type自动使用几种内置功能。即使你自己编写,你通常会继承一些现有的基类,所以它们通常看起来不太相似。

在最简单的情况下,也许一个暴露的数组可能会起作用(同样,对于你要做的事情知之甚少)。

Public Class DemoBarControl
    Inherits UserControl

    Private barz As Int32()
   <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    Public Property BarSizes As Int32()
        Get
            Return barz
        End Get
        Set(value As Int32())
            For n As Int32 = 0 To Math.Min(value.Count-1, 4)
                barz(n) = If(value(n) > 0, value(n), 0)
            Next
        End Set
    End Property

    Friend Function ShouldSerializeBarSizes() ...
    Friend Sub ResetBarSizes...

    Public Sub New()
        barz = {0, 1, 2, 3, 4}
    End Sub
    ...

这导致以下显示:

enter image description here

这可能是您下拉的意思吗?

这是在这种情况下自动使用的ExpandableObjectConverter。显示有点粗糙,因为它只是一个裸阵列,但它很简单。注意...按钮,它将打开标准集合编辑器并允许用户添加新元素(排序)。由于实际存储是一个数组,因此可以在Setter中过滤掉额外内容(并且可以测试范围),但这可能会使用户感到困惑。序列化由VS处理:

'
'DemoBarControl2
'
Me.DemoBarControl2.BarSizes = New Integer() {2, 5, 2, 3, 4}

所以,一切似乎都很好。看起来定义一个Bar(比如哪一个)可能会有更多。如果是这样,您可以定义Bar类来存储{索引,宽度,颜色} - 无论如何,并公开它们的集合。