动态创建时,用户控件无法重影已启用属性



我有一个自定义的UserControl(基本上是一个花哨的按钮(,它需要知道何时启用/禁用该控件才能更改绘图颜色。

我在我的控件中添加了一个Shadows属性,如下所示:

Private _enabled As Boolean
Public Shadows Property Enabled() As Boolean
Get
Return Me._enabled
End Get
Set(value As Boolean)
Me._enabled = value
' My code here to change the drawing colors
End Set
End Property

当使用GUI设计器(预编译(创建my控件时,这种方法似乎可以很好地工作。但是,当我在运行时动态创建控件时,GetSet代码永远不会运行。

你知道是什么原因造成的吗?

很难确定,因为您没有提供足够的信息,但我怀疑我知道问题出在哪里。当您跟踪成员时,必须通过派生类的引用访问该成员,才能调用派生实现。如果您使用基类型的引用,那么它就是您将调用的基实现。这与重写成员时不同,在这种情况下,无论引用的类型如何,都将调用派生实现。我通常将其概括为覆盖对象的类型,而阴影跟随引用的类型。试着运行这个代码,看看它在起作用:

Module Module1
Sub Main()
Dim dc As New DerivedClass
dc.OverrideMethod()
dc.ShadowMethod()
Dim bc As BaseClass = dc
bc.OverrideMethod()
bc.ShadowMethod()
End Sub
End Module
Public Class BaseClass
Public Overridable Sub OverrideMethod()
Console.WriteLine("BaseClass.OverrideMethod")
End Sub
Public Sub ShadowMethod()
Console.WriteLine("BaseClass.ShadowMethod")
End Sub
End Class
Public Class DerivedClass
Inherits BaseClass
Public Overrides Sub OverrideMethod()
Console.WriteLine("DerivedClass.OverrideMethod")
End Sub
Public Shadows Sub ShadowMethod()
Console.WriteLine("DerivedClass.ShadowMethod")
End Sub
End Class

这是输出:

DerivedClass.OverrideMethod派生类.阴影方法派生类OverrideMethodBaseClass.ShadowMethod

如您所见,通过基类型的引用调用阴影方法会调用基实现,而通过基类型引用调用重写方法会调用派生实现。

在您的特定情况下,当您在运行时添加实例时,您没有控件特定类型的字段来访问它,因此您可能通过窗体的Controls集合来访问它。这将返回一个Control引用,因此,如果您要通过它访问Enabled属性,它将是您调用的基本实现。如果要调用派生实现,则需要将该引用强制转换为控件的实际类型。这样做的一个选项是使用OfType方法按类型进行筛选,并同时进行强制转换,例如

Dim firstFancyButton = Controls.OfType(Of FancyButton)().First()

否则,执行显式强制转换,例如

Dim firstFancyButton = DirectCast(Controls("FancyButton1"), FancyButton)

相关内容

  • 没有找到相关文章

最新更新