2016-01-15 2 views
2

Хорошо, я боролся с этим в течение нескольких дней, и я нахожусь на своем конце ... Я пытаюсь добавить свойство просмотра, которое видно в PropertyGrid во время выполнения, Органы управления. Независимо от того, что я делаю, iExtenderProvider фактически не работает.VB.Net Расширение объекта 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» собственность и там ничего нет. Любые предложения относительно того, что может быть проблемой?

+0

Это не совсем правильный способ реализации 'IExtenderProvider' - некоторые вещи отсутствуют. И 'IExtenderProvider' хорошо работает с VS IDE, но это не связано с PropertyGrid, потому что это использует отражение для получения свойств - вам понадобится TypeConverter – Plutonix

+0

Чтобы уточнить, ExtenderProvider используется для добавления свойств во время разработки в VS. Они не являются реальными свойствами (см. Синтаксис добавления текста всплывающей подсказки). Для среды исполнения вам понадобится «TypeConverter» и пользовательский «PropertyDescriptor». Это много кода шаблона и, похоже, много работы для свойства RO. – Plutonix

+0

Был только отправной точкой ... конечный результат должен был быть интегрирован, чтобы иметь возможность получить псевдоним в PropertyGrid, чтобы пользователь мог «изменить имя управления» во время выполнения. –

ответ

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 имеет больше смысла.

+0

Я бы, по крайней мере, упомянул, что вы также можете наследовать, так как все образцы MSDN (хотя наследование от элемента управления кажется нечетным), – Plutonix

+1

@Plutonix Добавлен в ответ. Надеюсь, что ответ будет полезен будущим читателям. Это была конструктивная дискуссия. С удовольствием обсуждали с вами также. –

+0

Спасибо. Хм, похоже, мне нужно будет выяснить, как добавить новое свойство в любой элемент управления. Благодарю. –