Базовые классы конструктора
Обновлен: Ноябрь 2007
Все конструкторы реализуют интерфейс IDesigner, который определяет базовые методы интерфейса конструктора. Платформа .NET Framework также предоставляет набор базовых классов конструктора для доступа к методам, которые могут оказаться полезными для конструкторов, поддерживающих особые типы компонентов или элементов управления.
Интерфейс IDesigner
Класс конструктора должен реализовать интерфейс IDesigner, как это показано в следующем примере:
Public Interface IDesigner
Sub Dispose()
Sub Initialize(component As IComponent)
' Other methods.
...
ReadOnly Property Component() As IComponent
' Other properties.
...
End Interface
public interface IDesigner {
void Dispose();
void Initialize(IComponent component);
// Other methods.
...
IComponent Component {
get;
}
// Other properties.
...
}
Метод Initialize интерфейса IDesigner вызывается после размещения на узле и инициализации компонента конструктора и создания самого конструктора. Метод Initialize можно переопределить для выполнения действий, нужных во время инициализации компонента или конструктора. Процедуру инициализации конструктором компонента нельзя заменить, однако ее можно дополнить, кроме того, можно сбросить инициализируемые ею свойства. Свойство Component интерфейса IDesigner устанавливается посредством заданного метода инициализации. При переопределении метода Initialize из него следует всегда вызывать base.Initialize(component). Доступ к компоненту интерфейса IDesigner возможен с помощью его свойства Component.
Свойство Component предоставляет доступ к компоненту, с которым связан конструктор. Данное свойство устанавливается, когда впервые создается объект конструктора и вызывается его метод Initialize. Компонент имеет связанный с ним узел, и конструктор может использовать его для получения доступа к службам главного узла конструктора.
Метод DoDefaultAction вызывается при двойном щелчке по компоненту или элементу управления.
Свойство Verbs можно переопределить таким образом, чтобы возвращалась коллекция DesignerVerbCollection, содержащая объекты, необходимые для расширения набора элементов контекстного меню компонента.
Метод Dispose вызывается, когда необходимо уничтожить объект конструктора. Он вызывается всегда при удалении компонента из контейнера конструктора.
Базовый класс конструктора для компонентов
Класс ComponentDesigner реализует интерфейсы IDesigner и IDesignerFilter, предоставляя тем самым дополнительные методы, которые могут быть полезны некоторым конструкторам компонентов.
Базовый класс конструктора для элементов управления Windows Forms
Базовым классом конструктора для элементов управления Windows Forms является ControlDesigner. Данный класс является производным от ComponentDesigner и предоставляет дополнительные методы, полезные при настройке отображения и функционирования элемента управления Windows Forms. Пример реализации конструктора Windows Forms см. в разделе Практическое руководство. Реализация конструктора для элемента управления.
Класс DocumentDesigner предоставляет базовый класс конструктора, предназначенный для расширения реакции элемента Control на событие в режиме конструктора, а также для предоставления корневого вида режима конструктора для этого элемента; данный элемент поддерживает вложенные элементы управления и должен получать сообщения прокрутки. Дополнительные сведения см. в разделе Практическое руководство. Создание элемента управления Windows Forms, в котором используются преимущества функций, применяемых во время разработки.
Базовый класс конструктора для элементов управления сервера ASP.NET
Базовым классом конструктора для элементов управления сервера ASP.NET является ControlDesigner. Данный класс предоставляет основные функциональные средства для отрисовки пользовательского HTML-кода в режиме разработки. Другие базовые классы, предназначенные для таких задач, как редактирование шаблонов, представлены в разделе Design-Time Support for ASP.NET Web Pages.
Базовые классы для интеграции во время разработки
Класс TypeConverter предоставляет базовый класс для преобразования типа в текстовое представление и наоборот. Дополнительные сведения о преобразователях типов см. в разделах Практическое руководство. Реализация преобразователя типов и Обобщенное преобразование типов.
Класс UITypeEditor предоставляет базовый класс, наследуя от которого, можно разработать и расширить реализацию редактора настраиваемых типов для среды разработки. Дополнительные сведения о реализации класса UITypeEditor см. в разделе Общие сведения о редакторах типов пользовательского интерфейса.
Базовые классы для внешнего вида и поведения конструктора
Класс Behavior может быть расширен для разработки любого типа поведения пользовательского интерфейса, включая выделение, перетаскивание и изменение размера. Рисование и проверка нажатия выполняются с помощью класса Glyph.
Дополнительные сведения см. в разделе Общие сведения о службе расширения функциональности.
Базовые классы для загрузчиков конструктора
Класс BasicDesignerLoader предоставляет реализацию интерфейса IDesignerLoaderService. Интерфейс BasicDesignerLoader представляет собой законченную реализацию загрузчика конструктора и не привязан к постоянному формату.
Класс CodeDomDesignerLoader является абстрактным и предоставляет загрузчик конструктора полностью на основе модели CodeDOM.
Базовые классы для сериализации конструктора
Класс CodeDomSerializerBase предоставляет базовые классы для классов CodeDomSerializer. Класс CodeDomSerializerBase используется в качестве совместной базы между классом CodeDomSerializer и классом TypeCodeDomSerializer.
Класс DesignerSerializationManager предоставляет реализацию интерфейса IDesignerSerializationManager.
Дополнительные сведения см. в разделе Общие сведения о сериализации конструктора.
Базовый класс для смарт-тегов
Класс DesignerActionList предоставляет базовый класс для типов, которые определяют список элементов, используемых для создания области смарт-тега. Дополнительные сведения см. в разделе Практическое руководство. Вложение смарт-тегов в компонент Windows Forms.
Базовый класс для пользовательских макетов
Класс LayoutEngine предоставляет базовый класс для реализации механизмов формирования макетов. Элементы управления TableLayoutPanel и FlowLayoutPanel используют класс LayoutEngine для предоставления поведения макета. Дополнительные сведения см. в разделе Практическое руководство. Реализация пользовательского механизма размещения элементов управления в форме.
Стандартные конструкторы
SDK (пакет средств разработки программного обеспечения) для Windows предоставляет набор конструкторов для поддержки специфических типов компонентов. Эти конструкторы названы по именам создаваемых ими компонентов с добавлением слова Designer. Например, конструктор для класса System.Windows.Forms.Control называется System.Windows.Forms.Design.ControlDesigner.
Функциональные возможности конструктора
Доступ к службам, используемым во время разработки, из конструктора
Большинство типов служб, используемых во время разработки, можно запросить посредством метода GetService, передав тип запрашиваемой службы. Существует метод GetService, основанный на Component и ComponentDesigner. Кроме того, существует метод GetService, основанный на IServiceProvider, который реализуется с помощью элемента ISite, возвращаемого свойством Site интерфейса IComponent, находящегося в режиме конструктора.
В следующем коде показано, как получить интерфейс службы IDesignerHost и IMenuCommandService с помощью метода GetService.
Дополнительные сведения см. в разделе Практическое руководство. Обращение к службам времени разработки.
В следующем примере демонстрируется, как извлечь службу из интерфейса поставщика службы в режиме конструктора:
' Obtain an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Obtain an IMenuCommandService service.
Dim mcs As IMenuCommandService = CType(Me.Component.Site.GetService(GetType(IMenuCommandService)), IMenuCommandService)
// Obtain an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Obtain an IMenuCommandService service.
IMenuCommandService mcs =
(IMenuCommandService)this.Component.Site.GetService(typeof(IMenuCommandService));
Доступ к компонентам проекта из конструктора
Конструктор может получить доступ к компонентам документа, находящегося в режиме конструктора, обратившись к коллекции Components свойства Container интерфейса службы IDesignerHost. В следующем примере кода показано, как получить доступ к компонентам текущего проекта, находящегося в режиме конструктора:
' Obtains an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Gets the components container for the current design-time project.
Dim container As IContainer = host.Container
' The host.Container IContainer contains each IComponent in the project.
// Obtains an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Gets the components container for the current design-time project.
IContainer container = host.Container;
// The host.Container IContainer contains each IComponent in the project.
Получив доступ к коллекции компонентов, можно использовать методы TypeDescriptor и объекты PropertyDescriptor для идентификации типов и установки значений свойств компонентов. С помощью метода CreateComponent интерфейса IDesignerHost можно также создавать компоненты.
Расширение возможностей конструктора
При наследовании от компонента, имеющего связанный с ним конструктор, конструктор базового класса по умолчанию сопоставляется с производным компонентом. Другой конструктор можно связать с компонентом с помощью атрибута DesignerAttribute, который указывает тип связываемого с компонентом конструктора. Наличие у производного компонента конструктора, расширяющего возможности базового конструктора, является вполне обычной практикой.
Дополнительные сведения см. в разделе Практическое руководство. Реализация конструктора для элемента управления.
Расширение возможностей конструктора
Определите класс, производный от базового класса конструктора.
Свяжите новый класс конструктора с нужным компонентом, воспользовавшись атрибутом DesignerAttribute.
В следующем примере кода конструктор, расширяющий System.Web.UI.Design.WebControls.LabelDesigner, определяется и связывается с пользовательской меткой, расширяющей System.Web.UI.WebControls.Label.
Namespace MyControls.Design
Public Class MyLabelDesigner
Inherits System.Web.UI.Design.WebControls.LabelDesigner
End Class
End Namespace
Namespace MyControls
<Designer(GetType(MyControls.Design.MyLabelDesigner))> _
Public Class MyLabel
Inherits System.Web.UI.WebControls.Label
End Class
End Namespace
namespace MyControls.Design {
public class MyLabelDesigner : System.Web.UI.Design.WebControls.LabelDesigner {}
}
namespace MyControls {
[Designer(typeof(MyControls.Design.MyLabelDesigner))]
public class MyLabel : System.Web.UI.WebControls.Label {}
}
Примечание. |
---|
При определении конструктора для запечатанного класса, а также при необходимости предотвращения использования конструктора или наследования от него другими классами класс конструктора можно сделать внутренним по отношению к данной сборке. Узел конструктора, тем не менее, будет иметь возможность создать экземпляр такого конструктора, однако он не будет задействован в открытой объектной модели. |
См. также
Задачи
Практическое руководство. Обращение к службам времени разработки
Практическое руководство. Доступ к поддержке во время разработки в Windows Forms
Основные понятия
Практическое руководство. Реализация конструктора для элемента управления