.NET 用户控件——带下拉列表的子类?
.NET User Controls -- Subclass with dropdown?
我正在制作控件,但遇到了问题。
现在它可以很好地执行以下操作:
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
上面的例子在属性window中显示就好了。但是,我希望在同一个控件中显示 1-5 个柱,如果我只定义一个 array/list 或定义 _barWidth1、_barWidth2 等,它会很好地工作。但显然有更多的值然后只是宽度,它看起来在属性页中非常难看。
我想要像每个栏的 DROPDOWN 这样的东西,所以我考虑添加一个 class,即
Public Class CircularProgressBar : Inherits UserControl
Public Class BarTest
....subclasscode
End Class
..Class Code
End Class
但是,值的下拉列表不会出现。他们做 如果我做 Public Class BarTest :也继承了 UserControl,但是它带有大量不需要的值。我需要的是某种方式来下拉,但不需要继承用户控件的所有额外功能。我可能遗漏了一些非常小的东西。
谢谢!
尚不完全清楚 edited/saved 或这些是什么 - 因为您谈论的是 属性 编辑器,所以它们的性质具有一定的重要性。
UIType 编辑器不是一种风格选择。有几个内置的,VS 会根据类型自动使用。即使您自己编写,您通常也会继承一些现有的基础 class,因此它们最终不会经常看起来太不相似。
在最简单的情况下,暴露的数组可能会起作用(同样,对于您的工作知之甚少)。
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
...
结果如下:
这可能是您所说的下拉菜单的意思吗?
即本例中自动使用的ExpandableObjectConverter
。显示有点粗糙,因为它只是一个裸阵列,但很简单。请注意 ...
按钮,它将打开标准集合编辑器并允许用户添加新元素(某种程度上)。由于实际存储是一个数组,因此在 Setter 中过滤掉了额外内容(您可以测试范围),但这可能会使用户感到困惑。序列化由VS处理:
'
'DemoBarControl2
'
Me.DemoBarControl2.BarSizes = New Integer() {2, 5, 2, 3, 4}
所以,一切似乎都很好。似乎定义 Bar 可能还有更多内容(例如哪个)。如果是这样,您可以定义一个 Bar
class 来存储 {Index, Width, Color} - 无论如何,并公开它们的集合。
我正在制作控件,但遇到了问题。
现在它可以很好地执行以下操作:
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
上面的例子在属性window中显示就好了。但是,我希望在同一个控件中显示 1-5 个柱,如果我只定义一个 array/list 或定义 _barWidth1、_barWidth2 等,它会很好地工作。但显然有更多的值然后只是宽度,它看起来在属性页中非常难看。
我想要像每个栏的 DROPDOWN 这样的东西,所以我考虑添加一个 class,即
Public Class CircularProgressBar : Inherits UserControl
Public Class BarTest
....subclasscode
End Class
..Class Code
End Class
但是,值的下拉列表不会出现。他们做 如果我做 Public Class BarTest :也继承了 UserControl,但是它带有大量不需要的值。我需要的是某种方式来下拉,但不需要继承用户控件的所有额外功能。我可能遗漏了一些非常小的东西。
谢谢!
尚不完全清楚 edited/saved 或这些是什么 - 因为您谈论的是 属性 编辑器,所以它们的性质具有一定的重要性。
UIType 编辑器不是一种风格选择。有几个内置的,VS 会根据类型自动使用。即使您自己编写,您通常也会继承一些现有的基础 class,因此它们最终不会经常看起来太不相似。
在最简单的情况下,暴露的数组可能会起作用(同样,对于您的工作知之甚少)。
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
...
结果如下:
这可能是您所说的下拉菜单的意思吗?
即本例中自动使用的ExpandableObjectConverter
。显示有点粗糙,因为它只是一个裸阵列,但很简单。请注意 ...
按钮,它将打开标准集合编辑器并允许用户添加新元素(某种程度上)。由于实际存储是一个数组,因此在 Setter 中过滤掉了额外内容(您可以测试范围),但这可能会使用户感到困惑。序列化由VS处理:
'
'DemoBarControl2
'
Me.DemoBarControl2.BarSizes = New Integer() {2, 5, 2, 3, 4}
所以,一切似乎都很好。似乎定义 Bar 可能还有更多内容(例如哪个)。如果是这样,您可以定义一个 Bar
class 来存储 {Index, Width, Color} - 无论如何,并公开它们的集合。