Расширяемый объект 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
свойство для ваших элементов управления в сетке свойств.
- Добавить
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
имеет больше смысла.