好的,我已经和我斗争了几天而且我的智慧结束了...我正在尝试通过扩展Controls来添加在运行时在PropertyGrid中可见的可浏览属性。无论我做什么,iExtenderProvider似乎都没有真正运行。
iExtenderProvider位于第二个项目中,并且引用已添加到主项目中。 (下面的代码)
Imports System.ComponentModel
Imports System.Windows.Forms
Public Class ControlArray
Inherits Component
Implements IExtenderProvider
<Browsable(True)> Public ReadOnly Property Count As Integer
Get
Return 0
End Get
End Property
Public Function CanExtend(ByVal extendee As Object) As Boolean Implements IExtenderProvider.CanExtend
Return TypeOf extendee Is Control
End Function
End Class
然后我构建第二个项目,回到第一个项目,在我的属性窗口中没有任何内容,我在代码中实例化一个控件,然后尝试找到我的“Count”属性,那里什么也没有。关于可能出现什么问题的任何建议?
答案 0 :(得分:1)
在阅读答案之前
确保您知道:
扩展程序提供程序是为其他组件提供属性的组件。扩展程序提供程序提供的属性实际上驻留在扩展程序提供程序对象本身,因此它不是它修改的组件的真实属性。
在设计时,该属性会显示在属性窗口中。
在运行时,但是,您无法通过组件本身访问该属性。相反,您可以在扩展器组件上调用getter和setter方法。
实施扩展程序提供程序
Component
并实施IExtenderProvider
界面。ProvideProperty
属性装饰您的组件类,并引入提供的属性和目标控件类型。CanExtend
方法时,对要为其提供属性的每种控件类型都返回true。了解详情
示例强>
使用以下代码,您可以实现扩展程序组件ControlExtender
。当您构建代码并在表单上放置ControlExtender
的实例时,它会扩展所有控件并为属性网格中的控件添加SomeProperty on ControlExtender1
属性。
Component
并将其命名为ControlExtender
ControlExtender.vb
Imports System.ComponentModel
Imports System.Windows.Forms
<ProvideProperty("SomeProperty", GetType(Control))>
Public Class ControlExtender
Implements IExtenderProvider
Private controls As New Hashtable
Public Function CanExtend(extendee As Object) As Boolean Implements IExtenderProvider.CanExtend
Return TypeOf extendee Is Control
End Function
Public Function GetSomeProperty(control As Control) As String
If controls.ContainsKey(control) Then
Return DirectCast(controls(control), String)
End If
Return Nothing
End Function
Public Sub SetSomeProperty(control As Control, value As String)
If (String.IsNullOrEmpty(value)) Then
controls.Remove(control)
Else
controls(control) = value
End If
End Sub
End Class
注意:您也可以根据您的要求继承Control
。但在大多数情况下,继承Component
更有意义。