Объекты поставщиков расширителей
Поставщик расширителей — это компонент, предоставляющий свойства другим компонентам.Например, когда на форму добавляется компонент 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