Расширяемый объект VB.Net IExtenderProvider

Хорошо, я боролся с этим в течение нескольких дней, и я на грани остроумия... Я пытаюсь добавить просматриваемое свойство, которое будет видно в 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 ответ

Решение

Прежде чем читать ответ

Убедитесь, что вы знаете:

Поставщик расширителя - это компонент, который предоставляет свойства другим компонентам. Свойство, предоставленное поставщиком расширителя, фактически находится в самом объекте поставщика расширителя и, следовательно, не является истинным свойством компонента, который он изменяет.

Во время разработки свойство появляется в окне свойств.

Однако во время выполнения вы не можете получить доступ к свойству через сам компонент. Вместо этого вы можете вызвать методы getter и setter для компонента extender.

Для реализации провайдера расширителя

  • Наследовать от Component и реализовать IExtenderProvider интерфейс.
  • Украсьте свой класс компонентов ProvideProperty атрибут и введите предоставленное свойство и тип целевого элемента управления.
  • При реализации CanExtend метод, вернуть true для каждого типа элемента управления, для которого вы хотите предоставить свойство.
  • Реализуйте методы получения и установки для предоставленных свойств.

Учить больше

пример

Используя приведенный ниже код, вы можете реализовать компонент-расширитель 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
    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 имеет больше смысла.

Другие вопросы по тегам