3

好的,我已经为此奋斗了几天,但我束手无策......我正在尝试通过扩展控件来添加一个在运行时在 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

然后我构建第二个项目,回到第一个项目,在我的属性窗口中什么都没有,我在代码中实例化一个控件,然后尝试找到我的“计数”属性,但那里什么也没有。关于可能是什么问题的任何建议?

4

1 回答 1

2

在阅读答案之前

确保您知道:

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

在设计时,该属性出现在属性窗口中。

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

实现扩展器提供程序

  • 继承Component并实现IExtenderProvider接口。
  • 用属性装饰你的组件类ProvideProperty并引入提供的属性和目标控件类型。
  • 实现该CanExtend方法时,为您要为其提供属性的每个控件类型返回 true。
  • 为提供的属性实现 getter 和 setter 方法。

学到更多

例子

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

  1. 在项目中添加一个Component并命名ControlExtender
  2. 然后使用这些代码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根据您的要求进行继承。但在大多数情况下,继承 aComponent更有意义。

于 2016-01-15T01:03:35.607 回答