Главная » C#, Компоненты » Расположение компонентов друг на друге

0

Класс ParentcontrolDesigner реализует дизайнер, предназначенный для компонентов, которые содержат другие компоненты или сами содержатся в других компонентах. Этот класс имеет множество дополнительных свойств и методов, но наиболее интересны два (и еще про одно свойство я расскажу в следующем разделе):

П метод CanBeParentedTo (} позволяет определить класс компонентов, на которых может располагаться компонент; П метод CanParentO позволяет определить класс компонентов, которые могут располагаться на компоненте. Эти два метода управляют расположением компонентов друг на друге. Например, код из листинга 6.19 определяет, что компонент, к которому подключен дизайнер GradientLabeiDesigner, не может располагаться на компоненте типа Panel и не может содержать на себе компоненты типа Panel. Но простого переопределения метода в дизайнере недостаточно, чтобы запретить расположение компонента на определенном классе компонентов — его все еще можно перетащить из палитры компонентов, хотя и нельзя перемещать по форме. Окончательно запретить это действие можно с помощью перекрытия метода On Pa rent changed самого компонента, как показано в листинге 6.20.

ЛйОИНГ 6 19 ИсПОПЬ.ШЫ^НИи МО 1 одой ..il.t-in-l.t. и CtiJib>.L\tсс*411«" a’Jo

class GradientLabeiDesigner : ParentcontrolDesigner

{

protected override void PreFilterProperties(IDictionary properties}

{

base.PreFilterProperties(properties}; properties.Remove("BackColor"};

}

public override bool CanParent(Control control)

{

return !(control is Panel);

}

public override bool CanBeParentedTo(IDesigner parentDesigner)

}

return 1(parentDesigner.Component is Panel);

}

}

Лисгиж b 20 Запр<ч расположения компонента на гмнели

Lie partial class GradientLabel : Label

{

protected override void OnParentChanged(EventArgs e) {

base.OnParentChanged(e);

if (Parent != null) {

if (‘(Parent is panel))

throw new ApplicationException(

"Компонент не может располагаться на " + Parent.ToString{)};

}

f

}

6.18. Сетка дизайнера

Еще ОДИН метод класса ParentControlDesigner————— Метод DrawGrid, КОТорЫЙ

позволяет управлять отрисовкой сетки дизайнера. Если он возвращает false, сетка не будет рисоваться. Если true — сетка будет отрисована независимо от настроек самого дизайнера:

class GradientLabelDesigner : ParentControlDesigner {

protected override bool DrawGrid

{

get {

return false;

}

}

}

В принципе, перекрытие отрисовки сетки может потребоваться, например, для компонентов, выглядящих как рамка, но не имеющих своего фона. Именно прозрачность компонента будет являться основной проблемой — проступающая сквозь компонент сетка дизайнера не всегда выглядит красиво и соответствует задумке автора. В таких случаях сетку удобно выключить.

6.19. Инициализация компонентов

В заключение главы еще один полезный совет. Конструктор компонента вызывается при создании компонента независимо оттого, каким путем создается компонент. Соответственно, он будет вызван и при загрузке формы (загрузке каждого компонента на форме), и при добавлении новых компонентов на форму. Иногда возникает необходимость раздельно инициализировать существующие и новые компоненты, например, при инициализации координат компонента на форме. Решить этот вопрос можно с помощью виртуальных методов класса ComponentDesigner: InitializeExistingComponent И initializeNewComponent. Первый метод вызывается при инициализации существующих компонентов на форме, а второй— при инициализации нового компонента.

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии