Поделиться через


Объекты поставщиков расширителей

Поставщик расширителей — это компонент, предоставляющий свойства другим компонентам. Например, когда на форму добавляется компонент ToolTip, он предоставляет всем элементам управления на этой форме свойство ToolTip. В результате для каждого элемента управления в окне Свойства появляется свойство ToolTip, значение которого разработчик может установить во время разработки.

На самом деле свойство, предоставляемое поставщиком расширителей, находится в самом объекте поставщика расширителей и поэтому не является истинным свойством изменяемого компонента. Во время разработки это свойство появляется в окне Свойства для изменяемого компонента. Однако во время выполнения к свойству нельзя обратиться посредством этого компонента. В следующем примере кода создается форма с кнопкой MyButton и элементом управления ToolTip с именем MyToolTip, предоставляющим свойство ToolTip.

' This is an example of code that is NOT CORRECT!
Dim myString as String
myString = MyButton.ToolTip
// This is an example of code that is NOT CORRECT!
string myString;
myString = MyButton.ToolTip;

Этот синтаксис создает ошибку при компиляции, так как компилятор не распознает ToolTip как свойство кнопки MyButton, потому что данное свойство фактически предоставляется элементом управления MyToolTip. В следующем примере показано, как правильно обратиться к этому свойству:

Dim myString as String
myString = MyToolTip.GetToolTip(MyButton)
string myString;
myString = MyToolTip.GetToolTip(MyButton);

Поскольку поставщик расширителей является классом, то он может иметь собственные свойства и методы. Чтобы указать, что некоторое свойство должно предоставляться другим компонентам, необходимо на уровне класса применить атрибут ProvidePropertyAttribute. Этот атрибут задает имя предоставляемого свойства и тип объекта, для которого это свойство может быть предоставлено. Используется соглашение, по которому предоставляемое свойство реализуется не как свойство, а как пара методов. Эти методы должны иметь приставки "Get" и "Set" перед именем предоставляемого свойства. В следующем примере показано, каким образом это можно сделать:

Imports System.ComponentModel
<ProvideProperty("MyText", GetType(Control))> Public Class MyExtender
   <ExtenderProvidedProperty()> Public Function GetMyText(acontrol as _
      Control) as String
      ' Insert code to implement function.
   End Function
   Public Sub SetMytext (acontrol as Control)
      ' Insert code to implement function.
   End Function
End Class
using System.ComponentModel;
[ProvideProperty("MyText", typeof("Control"))]
public class MyExtender
{
[ExtenderProvidedProperty()]
   public string GetMyText(Control acontrol)
   {
      // Insert code to implement method.
   }
   public void SetMyText(Control acontrol)
   {
      // Insert code to implement method.
   }
}

Реализация предоставляемого свойства требует наличия объекта Hashtable или аналогичного объекта коллекции для записи и извлечения значений свойств для каждого элемента управления. Дополнительные сведения см. в разделе Практическое руководство. Реализация поставщика расширения.

Каждый класс расширителя также должен реализовывать интерфейс IExtenderProvider. Этот интерфейс состоит из единственного метода CanExtend, возвращающего логическое значение и показывающего конструктору, может ли компонент быть расширен. Например, может понадобиться создать расширитель, который будет предоставлять свойство только для элементов управления. В следующем примере показано, как реализовать метод CanExtend:

Imports System.ComponentModel
Public Function CanExtend(ByVal extendee As Object) As Boolean _
   Implements IExtenderProvider.CanExtend
   If Typeof extendee Is Control Then
      Return True
   Else
      Return False
   End If
End Function
public bool CanExtend(object extendee) 
{
   if (extendee is Control)
      return true;
   else
      return false;
}

См. также

Задачи

Практическое руководство. Реализация поставщика расширения

Практическое руководство. Реализация поставщика расширителей HelpLabel

Ссылки

IExtenderProvider

ProvidePropertyAttribute

Другие ресурсы

Поставщики расширителей