Главная » C#, Компоненты » Контекстное меню компонента

0

В этом разделе я расскажу, как формировать контекстное меню компонента, вызываемое по щелчку правой кнопки мыши. Вообще говоря, контекстное меню формируется с помощью класса DesignerVerb и свойства verbs класса componentDesigner, но, прежде чем начать рассказывать про эти классы, хочу раскрыть небольшой секрет. Класс DesignerActionMethoditem имеет еще один конструктор, о котором я не рассказал в предыдущем разделе. Шестым параметром конструктора можно указать дизайнеру автоматически создать пункт контекстного меню, соответствующий вызываемому методу (рис. 6.6):

items.Add(new DesignerActionMethoditem(this, "InvertColors", "Перевернуть цвета", "Methods", "Поменять начальный и конечный цвета местами", true));

Рис. 6.6. Контекстное меню, соответствующее методам тега

Аналогично созданию тега, для создания контекстного меню нужно перекрыть свойство Verbs класса ComponentDesigner (ЛИСТИНГ 6.6) И вернуть экземпляр класса, который должен быть наследован от DesignerVerbCollection (листинг 6.7). Коллекция заполняется объектами класса DesignerVerb вида: DesignerVerb (имя__меню, new EventHandler (метод) ) Например:

Add (new DesignerVerb ("Перевернуть- &цвета"г

new EventHandler(OnlnvertColors)));

В методе omnvertcoiorO, в нашем случае, я переставляю местами значения полей StartColor и EndColor. Снова обращаю внимание, что установка свойств компонента производится с помощью дескрипторов (см. разд. 4.5), получаемых ВЫЗОВОМ метода GetPropertyByName (), а не напрямую.

И еще одно замечание. Не знаю зачем, но при создании контекстного меню дизайнер автоматически создает окно тега, содержащее пункты контекстного меню. Кроме того, команды, соответствующие пунктам меню, создаются в леииалыюй области редактора свойств (рис. 6.7).

Листинг 6 б

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.ComponentModel.Design;

namespace MyControl

}

class GradientLabelDesigner : ControlDesigner

{

DesignerVerbCollection verbs; // Пункты контекстного меню

public override DesignerVerbCollection Verbs (

get (

if (verbs == null) (

verbs — new GradientLabelVerbCollection(this.Component);

}

return verbs;

!

Листинг 6 7 Коллекция элементов контекстного меню

using System;

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

using System.ComponentModel.Design; using System.ComponentModel; using System.Drawing;

namespace MyControl {

class GradientLabelVerbCollection : DesignerVerbCollection {

GradientLabel glabel;

public GradientLabelVerbCollection(IComponent component) {

// Сохраняем ссылку на редактируемый компонент glabel = component as GradientLabel;

// Создаем пункты меню

Add(new DesignerVerb("Перевернуть &цвета",

new EventHandler(OnlnvertColors)));

}

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

// Меняем цвета местами

PropertyDescriptor start = GetPropertyByName("StartColor"); PropertyDescriptor end = GetPropertyByName("EndColor"); Color tmp = (Color)start.GetValue{glabel); start.SetValue(glabel, end.GetValue(glabel)); end.SetValue(glabel, tmp);

}

// Возвращаем дескриптор свойства по имени

private PropertyDescriptor GetPropertyByName {String propName) {

PropertyDescriptor prop -

TypeDescriptor.GetProperties(glabel)[propName];

if (prop == null) {

throw new ArgumentException("Свойство не существует", propName);

Литература:

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

По теме:

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