VB.Net扩展对象IExtenderProvider

时间:2016-01-15 00:39:20

标签: vb.net winforms iextenderprovider

好的,我已经和我斗争了几天而且我的智慧结束了...我正在尝试通过扩展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”属性,那里什么也没有。关于可能出现什么问题的任何建议?

1 个答案:

答案 0 :(得分:1)

在阅读答案之前

确保您知道:

扩展程序提供程序是为其他组件提供属性的组件。扩展程序提供程序提供的属性实际上驻留在扩展程序提供程序对象本身,因此它不是它修改的组件的真实属性。

在设计时,该属性会显示在属性窗口中。

在运行时,但是,您无法通过组件本身访问该属性。相反,您可以在扩展器组件上调用getter和setter方法。

实施扩展程序提供程序

  • 继承自Component并实施IExtenderProvider界面。
  • 使用ProvideProperty属性装饰您的组件类,并引入提供的属性和目标控件类型。
  • 实现CanExtend方法时,对要为其提供属性的每种控件类型都返回true。
  • 为提供的属性实现getter和setter方法。

了解详情

示例

使用以下代码,您可以实现扩展程序组件ControlExtender。当您构建代码并在表单上放置ControlExtender的实例时,它会扩展所有控件并为属性网格中的控件添加SomeProperty on ControlExtender1属性。

  1. 向项目添加Component并将其命名为ControlExtender
  2. 然后在ControlExtender.vb
  3. 中使用这些代码
    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更有意义。