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