Поделиться через


Практическое руководство. Изменение стандартной команды меню в доменном языке

Можно изменить поведение некоторых стандартных команд, которые определяются автоматически в вашем DSL.Например, можно изменить Вырезать таким образом, что исключит конфиденциальные сведения.Для этого переопределите методы в классе набора команд.Эти классы определены в файле CommandSet.cs в проекте DslPackage и производными от CommandSet.

Вкратце, изменить команду:

  1. Можно изменить определения, какие команды.

  2. Создайте частично объявление соответствующего класса набора команд.

  3. переопределите методы ProcessOnStatus и ProcessOnMenu для команды.

В этом разделе объясняется эту процедуру.

ПримечаниеПримечание

Если нужно создать собственные команды меню, см. раздел Практическое руководство. Добавление команды в контекстное меню.

Какие команды можно изменить?

Выяснить, какие команды можно изменить

  1. в DslPackage открытый проект GeneratedCode\CommandSet.cs.Этот файл c# можно найти в обозревателе решений как дочернее подразделение CommandSet.tt.

  2. Найдите классы в этом файле, имена которых заканчиваются "CommandSetнапример, " Language1CommandSet и Language1ClipboardCommandSet.

  3. В каждой команде set класс, введите "override", за которой следуют пробел.IntelliSense отображает список методов, которые можно переопределить.Каждая команда имеет пару методов, имена которых начинаются "ProcessOnStatus"и"ProcessOnMenu".

  4. Обратите внимание, что из классов набора команд содержит команду, которую необходимо изменить.

  5. Закройте файл без сохранения правки.

    ПримечаниеПримечание

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

Расширение соответствующий класс набора команд

Создайте новый файл, содержащий частично объявление класса набора команд.

Расширение класса набора команд

  1. В обозревателе решений в проекте DslPackage, откройте папку GeneratedCode а затем разверните узел CommandSet.tt и откройте его созданный файл CommandSet.cs.Обратите внимание на пространство имен и имя первого класса, который определен в ней.Например, можно отобразить:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. IN DslPackageсоздайте папку с именем пользовательским кодом.В этой папке создайте новый файл класса с именем CommandSet.cs.

  3. В новом файле, напишите объявление, частично имеет те же имя и пространство имен, что созданного разделяемого класса.Примеры.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    Примечание.   Если используется шаблон файл класса для создания нового файла следует исправить и пространство имен и имя класса.

Переопределите методы команды

Большинство команд имеют 2, связанных методов: Метод с именем like ProcessOnStatus…определяет, должна ли команда быть видна, а.Она вызывается, когда пользователь щелкнул правой кнопкой мыши схему и должна выполняться быстро и не делать никаких изменений. ProcessOnMenu…вызывается, когда пользователь выбирает соответствующую команду, и выполнить функцию команды.Можно переопределить или один или оба этих методов.

Dd820672.collapse_all(ru-ru,VS.110).gifКогда появится в меню изменить команда

Переопределите ProcessOnStatus…Метод .Этот метод должен установить видимые и включенные свойства своего параметра MenuCommand.Обычно вид, что this.CurrentSelection указывает, применяется ли команда к выбранным элементам ", и может также просматривать, что команда их свойства, определен ли команда может применяться в их текущем состоянии.

Как руководство, видимое свойство должно быть указано, какие элементы выбраны.Свойство enabled, которое указывает, отображается ли команда черного или серой в меню, от которого зависит текущее состояние выделения.

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

ПримечаниеПримечание

Этот метод не влияет на ли команда доступна через нажатие клавиши.Например, чтобы отключить пункт меню не предотвращает удаление из команды вызывать с помощью ключа удаления.

/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
  // Default settings from the base method.
  base.ProcessOnStatusDeleteCommand(command);
  if (this.CurrentSelection.Count > 1)
  {
    // If user has selected more than one item, Delete is greyed out.
    command.Enabled = false;
  }
}

Рекомендуется сначала вызвать базовый метод, чтобы работать со всеми вариантами и параметры с которой вы не точки.

Метод не должен ProcessOnStatus создание, удаление или обновление элементов в хранилище.

Dd820672.collapse_all(ru-ru,VS.110).gifИзменения применяются расширения функциональности команды

Переопределите ProcessOnMenu…Метод .Следующий пример запрещает удаление пользователя из более чем одного элемента за один раз, даже с помощью ключа удаления.

/// <summary>
/// Called when user presses Delete key 
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
  // Allow users to delete only one thing at a time.
  if (this.CurrentSelection.Count <= 1)
  {
    base.ProcessOnMenuDeleteCommand();
  }
}

Если код вносит изменения в хранилище, таких как создание, удаление или обновление элементов или ссылки, необходимо сделать в транзакции.Дополнительные сведения см. в разделе Практическое руководство. Изменение стандартной команды меню в доменном языке.

Dd820672.collapse_all(ru-ru,VS.110).gifСоздание кода методов

Следующие фрагменты часто используются в рамках этих методов.

  • this.CurrentSelection.Фигура, пользователь щелкнул правой кнопкой мыши всегда включена в этом списке фигур и соединителей.Если пользователь щелкнет пустую область схемы, схема единственный элемент списка.

  • this.IsDiagramSelected() - true если пользователь нажимает пустую область схемы.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() - пользователь не выбрал несколько фигур

  • this.SingleSelection - форма или схема, к которой пользователь щелкнул правой кнопкой мыши

  • shape.ModelElement as MyLanguageElement - элемент модели, представляемый фигурой.

Дополнительные сведения о том, как переходить от элемента к элементу и о способах создания объектов и связей см. в разделе Перемещение по модели и обновление модели в коде программы.

См. также

Задачи

Практическое руководство. Добавление команды в контекстное меню

[перенаправление] Пошаговое руководство. Получение информации с помощью выбранной связи

Основные понятия

Как VSPackages добавления элементов пользовательского интерфейса в IDE

Справочник по схеме XML VSCT

Другие ресурсы

Написание кода для настройки доменного языка

Файлы таблицы команд Visual Studio (.Vsct)