Главная » C#, Компоненты » Управление выделенными компонентами

0

В разд. 6.14 нам надо было управлять видимостью слоя с нашим маркером в зависимости от выбранного компонента. Если компонент выбран, мы показывали слой, если выделение снималось или перемещалось на другой компонент, слой надо было скрыть. Тогда я использовал не самый лучший способ определения изменения выбора элемента, и пришла пора разобраться, как сделать это наиболее корректно.

Для получения нотификаций об изменении выделенного компонента и

управления выделением служит сервис iseiectionservice.

Вот список наиболее интересных свойств, методов и событий этого сервиса:

?    свойство object PrimarySelection возвращает "основной" (т. е. выбранный первым) компонент;

?    свойство int selectionCount возвращает количество выбранных компонентов;

base.Dispose(disposing);

}

)

1

?    событие event EventHandler SelectionChanging вызывается ПереД изменением выбранного компонента;

?          событие event Event Handle г SelectionChanged вызывается ПОСЛе изменения выбранного компонента;

?          метод bool GetComponentSelected(object component) позволяет проверить, является ли компонент выбранным;

?          метод iCollection GetselectedComponents () возвращает коллекцию выбранных компонентов;

?          методы void SetSelectedComponents(ICollection components) И void SetSelectedComponents(ICollection солролелts, selectionTypes selecCionType) позволяют установить выбранные компоненты.

В листинге 7.2 показано, как правильно обработать событие изменения выбранного компонента с помощью сервиса iseiectionservice. Все, что нужно сделать, — это получить интерфейс сервиса с помощью метода GetserviceO и зарегистрировать обработчик события SelectionChanged.

Листиж 7 2 Пример оирабогки ооЬытии сервиса is«iecl loi.Sorvj.ce

using System; using System.Collections; using System.Collections.Generic; using System.Text;

using System.Windows.Forms.Design; using System.Drawing; using System.ComponentModel; using System.Windows.Forms;

using System.Windows.Forms.Design.Behavior; using System.ComponentModel.Design;

namespace MyControl {

class GradientLabelDesigner : ControlDesigner {

private Adorner zoomAdorner;

public override void initialize{IComponent component) {

base.Initialize(component);

// Добавляем слой zoomAdorner = new Adorner}); zoomAdorner.Enabled «= false;

BehaviorService.Adorners.Add(zoomAdorner);

// Добавляем метку в новый слой

zoomAdorner.Glyphs.Add(new ZoomGlyph(BehaviorService, Control));

// Регистрируем свой обработчик изменения выделения //с помощью сервиса ISelectionService ISelectionService s = (ISelectionService) GetService(typeof(ISelectionService));

s.SelectionChanged += new EventHandler(OnSelectionChanged);

}

protected override void Dispose(bool disposing) I

// Удаляем слой

if (disposing && zoomAdorner != null) (

BehaviorService b – BehaviorService;

if (b !— null) {

b.Adorners.Remove(zoomAdorner);

}

}

}

// Вызывается при изменении выделения компонента

private void OnSelectionChanged(object sender, System.EventArgs e) {

// Управляем видимостью слоя при изменении // выделенного компонента BehaviorService b = BehaviorService;

if (b != null) {

int index = b.Adorners.IndexOf(zoomAdorner);

if (index > 0) {

ISelectionService s = (ISelectionService)

GetService{typeof(ISelectionService)); b.Adorners[index].Enabled =

s.PrimarySelection == this.Component;

Метод setseiectedcomponent {) полезен при организации меню Выделить все компоненты такого же типа или аналогичного. Кроме того, иногда возникает необходимость повторного создания компонента на форме. Например, при изменении каких-то глобальных настроек проще заново создать компонент, чем заставить его перечитать изменения. Для этого можио использовать такую последовательность действий:

1.         Сохранить положение компонента на форме.

2.         Выделить компонент С ПОМОЩЬЮ метода SetSelectedComponent ().

3.         С помощью сервиса IMenuCommandService (см. следующий раздел) вырезать компонент в буфер и снова вставить его.

4.         Восстановить положение компонента.

5.         С помощью вызова SetSelectedComponent (null) убрать выделение с компонента.

В листинге 7.3 показана реализация этого алгоритма. Писшнг 7 3. Порссо.»дание компонент

protected void ReLoadComponent(Component component) i

Point p = new Point (); // Сохраняем положение на форме

if (component is Contro1) {

p = (component as Control).Location;

}

// Получаем интерфейсы сервисов IMe nuCornmandS e rv i ce irnc s -

(IMenuCommandService)this.GetService(typeof(IMenuCommandService)) ; ISelectionService iss =

(ISelectionService)this.GetService(typeof(ISelectionService)); // Выделяем компонент

iss.SetSelectedComponents(new IComponent[] { component },

SelectionTypes.Auto}; // Вызываем удаление (Cut) и вставку (Paste) irncs.Globallnvoke(StandardCommands.Cut}; imcs.Globallnvoke(StandardCommands.Paste); // Запоминаем ссылку на компонент Component cmp – (Component}iss.primarySelection; // Сбрасываем выделение iss.SetSelectedComponents{null);

II Обновляем свойства TypeDescriptor.Refresh(cmp); // Восстанавливаем положение

if {cmp i s Control) {

(cmp as Control).Location = p; (cmp as Control).Focus();

}

)

Литература:

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

По теме:

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