VB.Net 扩展对象 IExtenderProvider
VB.Net Extending Object IExtenderProvider
好吧,我已经为此奋斗了几天,我已经束手无策了...我正在尝试添加一个可浏览的 属性,它在 运行 期间在 PropertyGrid 中可见]time 通过扩展控件。无论我做什么,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
然后我构建第二个项目,回到第一个项目,我的属性中没有任何内容window,我在代码中实例化一个控件,然后尝试找到我的"Count"属性 那里什么也没有。关于可能出现的问题有什么建议吗?
阅读答案之前
确保你知道:
扩展程序提供程序是向其他组件提供属性的组件。扩展器提供者提供的 属性 实际上驻留在扩展器提供者对象本身中,因此不是它修改的组件的真实 属性。
在设计时, 属性 出现在 属性 window 中。
在运行时,然而,您无法通过组件本身访问属性。相反,您可以在扩展程序组件上调用 getter 和 setter 方法。
实现扩展程序提供程序
- 继承自
Component
并实现IExtenderProvider
接口。
- 用
ProvideProperty
属性修饰组件 class 并引入提供的 属性 和目标控件类型。
- 在实施
CanExtend
方法时,return 对于您要为其提供 属性 的每个控件类型为真。
- 为提供的属性实施 getter 和 setter 方法。
了解更多
例子
使用下面的代码你可以实现一个扩展组件ControlExtender
。当您构建代码并将 ControlExtender
的实例放在表单上时,它会扩展所有控件并在 属性 网格中为您的控件添加 SomeProperty on ControlExtender1
属性。
- 在项目中添加一个
Component
并命名为ControlExtender
- 然后在
ControlExtender.vb
中使用这些代码
Imports System.ComponentModel
Imports System.Windows.Forms
<ProvideProperty("SomeProperty", GetType(Control))>
Public Class ControlExtender
Inherits Component
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
更有意义。
好吧,我已经为此奋斗了几天,我已经束手无策了...我正在尝试添加一个可浏览的 属性,它在 运行 期间在 PropertyGrid 中可见]time 通过扩展控件。无论我做什么,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
然后我构建第二个项目,回到第一个项目,我的属性中没有任何内容window,我在代码中实例化一个控件,然后尝试找到我的"Count"属性 那里什么也没有。关于可能出现的问题有什么建议吗?
阅读答案之前
确保你知道:
扩展程序提供程序是向其他组件提供属性的组件。扩展器提供者提供的 属性 实际上驻留在扩展器提供者对象本身中,因此不是它修改的组件的真实 属性。
在设计时, 属性 出现在 属性 window 中。
在运行时,然而,您无法通过组件本身访问属性。相反,您可以在扩展程序组件上调用 getter 和 setter 方法。
实现扩展程序提供程序
- 继承自
Component
并实现IExtenderProvider
接口。 - 用
ProvideProperty
属性修饰组件 class 并引入提供的 属性 和目标控件类型。 - 在实施
CanExtend
方法时,return 对于您要为其提供 属性 的每个控件类型为真。 - 为提供的属性实施 getter 和 setter 方法。
了解更多
例子
使用下面的代码你可以实现一个扩展组件ControlExtender
。当您构建代码并将 ControlExtender
的实例放在表单上时,它会扩展所有控件并在 属性 网格中为您的控件添加 SomeProperty on ControlExtender1
属性。
- 在项目中添加一个
Component
并命名为ControlExtender
- 然后在
ControlExtender.vb
中使用这些代码
Imports System.ComponentModel
Imports System.Windows.Forms
<ProvideProperty("SomeProperty", GetType(Control))>
Public Class ControlExtender
Inherits Component
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
更有意义。