Главная » C#, Компоненты » Нотификации о смене дизайнера

0

Каждый раз при открытии дизайнера формы Visual Studio создает соответствующий класс дизайнера. При закрытии формы этот объект уничтожается. Кроме того, при переключении между страницами редактора текущий активный дизайнер (active designer) переключается в соответствии с выбранной страницей. Получать уведомления о смене дизайнера позволяет сервис IDesignerEventService, который имеет следующий список свойств и событий:

?          свойство iDesignerHost ActiveDesigner возвращает активный дизайнер или null, если активного дизайнера нет (например, фокус находится в редакторе кода);

О свойство DesignerCollection Designers возвращает коллекцию дизайнеров, созданных к текущему моменту и еще не уничтоженных;

?          событие event ActiveDesignerEventHandler ActiveDesignerChanged вызывается при смене активного дизайнера (например, при переключении из формы в код или из формы в другую форму);

О событие event DesignerEventHandler DesignerCreated вызывается при создании нового дизайнера (например, при открытии формы);

?          событие event EventHandler SelectionChanged вызывается при изменении текущего выбранного компонента (см. также разд. 7.5).

При смене дизайнера в событие ActiveDesignerChanged передается параметр типа ActiveDesignerEventArgs, содержащий ПОЛЯ OldDesigner И NewDesigner, соответствующие предыдущему и новому дизайнеру. Стоит отдельно отметить, что при переключении из дизайнера формы в код поле NewDesigner будет равно null, а при переключении обратно пустым будет параметр OldDesigner.

В листинге 7.10 показан пример компонента, принимающего уведомления о смене дизайнера, а на рис. 7.4 — результат работы.

Лис тинг 7 10 Получении нотификации о смене дизайнера

using  System;

using  System.Data;

using  System.Drawing;

using  System.Collections;

using  System.ComponentModel;

using  System.ComponentModel.Design;

using  System.Windows.Forms;

namespace DesignerEventServiceExample

{

public class DesignerEventComponent : UserControl

{

// Буфер для отображения сообщений private ListBox logListBox;

// Конструктор

public DesignerEventComponent()

{

initializeComponent{);

}

private void InitializeComponent()

{

this.logListBox = new System.Windows.Forms.ListBox(); this.SuspendLayout() ;

//

// logListBox

//

this.logListBox.Dock = System.Windows.Forms.DockStyle.Fill; this.logListBox.Location — new System.Drawing.Point (0, 0); this.logListBox.Name = "logListBox";

this.logListBox.Size = new System.Drawing.Size (200, 95); this.logListBox.Tablndex – 0;

//

// DesignerEventComponent

//

this.Controls.Add(this.logListBox}; this.Name = "DesignerEventComponent"; this.Size – new System.Drawing.Size(200, 100); this.ResumeLayout(false} ;

}

// Свойство Site устанавливается дизайнером только в режиме // разработки в момент установки связи между дизайнером //и компонентом. Именно в этот момент мы будем // регистрировать обработчики событий сервиса

public override ISite Site {

get

{

return base.Site;

set

{

// Очистить предыдущие обработчики, если они бьши установлены ClearChangeNotifications{);

// Сохраняем значение Site base.Site = value/

// Регистрируем свои обработчики уведомлений RegisterChangeNotifications(};

}

}

// Удаление обраОотчикоь соОцтии

private void ClearChangeNotifications()

{

// Получаем ссылку на сервис IDesignerEventService designerEventService = (IDesignerEventService)GetService( typeof(IDesignerEventService));

// Если сервис не null, значит, это режим разработки

if {designerEventService !- null)

{

designerEventService.ActiveDesignerChanged —= new ActiveDesignerEventHandler(

designerEventService_ActiveDesignerChanged); designerEventService.DesignerCreated -= new DesignerEventHandler{

designerEventService_DesignerCreated); designerEventService.DesignerDisposed -= new DesignerEventHandler{

designerEventService_DesignerDisposed};

}

}

// Регистрируем обработчики событий

private void RegisterChangeNotifications {} {

// Получаем ссылку на сервис IDesignerEventService designerEventService — (IDesignerEventService)GetService( typeof {IDesignerEventService) ) if (designerEventService != null) {

designerEventService.ActiveDesignerChanged += new ActiveDesignerEventHandler{

designerEventService_ActiveDesignerChanged); designerEventService.DesignerCreated += new DesignerEventHandler(

designerEventService_DesignerCreated); designerEventService.DesignerDisposed += new DesignerEventHandler(

designerEventService_DesignerDisposed};

}

}

// Дизайнер закрыт

void designerEventService_DesignerDisposed(

object sender, DesignerEventArgs e)

{

DoLog{"Дизайнер закрыт");

}

// Дизайнер создан

void designerEventService DesignerCreated(

object sender, DesignerEventArgs e)

{

DoLog("Дизайнер создан");

}

// Дизайнер изменен

void designerEventService_ActiveDesignerChanged(

object sender, ActiveDesignerEventArgs e}

{

string newType = "<none>"; if (e.NewDesigner != null)

if (e.NewDesigner.GetType() !- null)

newType = e.NewDesigner.GetType{).ToString {);

string oldType = "<none>"; if (e.OldDesigner != null)

if (e.OldDesigner.GetType() != null)

oldType = e.OldDesigner.GetType{).ToString();

DoLog{string.Format("Смена с {0} на {1}", oldType, newType));

// Добавляем строку в журнал

private void DoLog(string text)

{

logListBox.Items.Add(text);

logListBox.Selectedlndex = logListBox.Items.Count — 1;

}

// Сброс обработчиков при освобождении компонента protected override void Dispose(bool disposing) i

if (disposing)

{

ClearChangeNotifications() ;

}

base.Dispose(disposing);

}

}

}

Рис. 7.4. Уведомления об изменениях дизайнера

Литература:

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

По теме:

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