Добавление команд Visual Studio
Команда, представленная Command
классом, — это некоторые действия, которые могут быть инициированы пользователем, например, когда пользователь выбирает пункт меню, нажимает кнопку панели инструментов или вводит сочетание клавиш. Команды имеют отображаемое имя, метод выполнения (ExecuteCommandAsync
), выполняющий действие, значок для отображения на панели инструментов для идентификации команды и подсказки, чтобы объяснить команду пользователю. Команды можно включить или отключить в зависимости от различных условий.
Команды в новой модели расширяемости выполняются асинхронно, чтобы пользователь продолжал взаимодействовать с интегрированной среды разработки во время выполнения команд.
Работа с командами
В этом обзоре рассматриваются следующие основные сценарии работы с командами:
- Создание команды
- Размещение команды в интегрированной среде разработки
- Добавление значка в команду
- Добавление сочетаний клавиш в команду
- Настройка команды
- Изменение отображаемого имени команды
Создать команду
Создание команды с новой моделью расширяемости начинается с расширения базового класса, украшения класса Command
атрибутом VisualStudioContribution
и реализации CommandConfiguration
свойства.
[VisualStudioContribution]
public class MyCommand : Command
{
/// <inheritdoc />
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%");
}
Класс CommandConfiguration
Класс CommandConfiguration
имеет несколько параметров, с которыми вы должны ознакомиться:
Параметр | Type | Обязательно | Описание |
---|---|---|---|
DisplayName |
String | Да | Отображаемое имя команды по умолчанию. Заключите эту строку символом "%", чтобы включить локализацию этой строки. См. раздел "Локализация метаданных". |
ToolTipText |
Строка | Нет | Текст, отображаемый в виде подсказки при наведении указателя мыши или фокуса команды. Заключите эту строку символом "%", чтобы включить локализацию этой строки. См. сведения о локализации метаданных |
Флаги | CommandFlags | No | Флаги для задания дополнительных свойств в команде. Некоторые варианты включают CanToggle и CanSelect. См. раздел "Флаги команд". |
Размещения | CommandPlacement[] | No | Указывает существующие группы в Visual Studio, в которые будет вложена команда. См. команду в интегрированной среде разработки. Даже без размещения команда по-прежнему будет доступна с помощью функции поиска Visual Studio. Команды также можно поместить в меню, панели инструментов и группы , определенные в расширении. |
Icon | CommandIconConfiguration | No | Команды можно отображать в пользовательском интерфейсе как просто значок, значок с текстом или просто текстом. Это свойство настраивает то, что должен быть значок, если он есть, и как он должен отображаться. |
Ярлыки | CommandShortcutConfiguration[] | No | Определяет набор сочетаний ключей, которые можно использовать для выполнения команды. Ярлыки можно область вниз, чтобы применяться только к определенным контекстам интегрированной среды разработки. Ознакомьтесь с ярлыками. |
ClientContexts[] | Строка | Нет | Контексты клиента, запрошенные командой. По умолчанию возвращаются контексты оболочки и редактора. Контекст клиента — это моментальный снимок определенных состояний интегрированной среды разработки во время выполнения команды. Так как эти команды выполняются асинхронно, это состояние может измениться между временем выполнения команды и обработчиком команд. Ознакомьтесь с контекстами клиента. |
Пример
Кроме Command
того, требуется конструктор, который принимает VisualStudioExtensibility
объект (который позволяет обмену данными с интегрированной среды разработки) и методом ExecuteCommandAsync
выполнения. В следующем примере представлена минимальная реализация универсальной команды, которая ничего не делает:
[VisualStudioContribution]
public class MyCommand : Command
{
/// <inheritdoc />
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%");
public MyCommand(VisualStudioExtensibility extensibility)
: base(extensibility)
{
}
public override Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
Размещение команды в интегрированной среде разработки
В Visual Studio есть набор хорошо определенных мест, где можно разместить команды. Эти размещения определяются свойством KnownPlacements
класса CommandPlacement
. Текущий KnownPlacements
набор:
ToolsMenu
— Команда будет помещена в группу в меню "Сервис" верхнего уровня в Visual Studio.ViewOtherWindowsMenu
— Команда будет помещена в группу в меню верхнего уровня "Вид" —> "Другие окна" в Visual Studio.ExtensionsMenu
— Команда будет помещена в группу в меню "Расширения" верхнего уровня в Visual Studio.
Команды также можно поместить с помощью метода, указав Guid
и Id
группу, определенную с помощью CommandPlacement.VsctParent
VSCT.
Команды, родительские для той же группы, сортируются по свойству размещения Priority
относительно других команд или меню с тем же размещением. Значение по умолчанию Priority
для объекта CommandPlacement
is 0
и может быть изменено путем вызова CommandPlacement.WithPriority
метода, передав требуемого Priority
значения.
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%")
{
// The command will be parented to a group inside of the "Tools" top level menu,
// a group inside of the "Extensions" top level menu, and the "About" group inside of the "Help" top level menu
Placements = new CommandPlacement[]
{
CommandPlacement.KnownPlacements.ToolsMenu,
CommandPlacement.KnownPlacements.ExtensionsMenu.WithPriority(0x0100),
CommandPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id: 0x016B, priority: 0x0801),
},
};
Добавление значка в команду
Команды поддерживают добавление значков в их пункт меню в дополнение или вместо отображаемого имени команды. Чтобы добавить значок в команду, задайте Icon
свойство в команде CommandConfiguration
.
CommandIconConfiguration
Имеет CommandIconConfiguration
два параметра:
Параметр | Type | Обязательно | Описание |
---|---|---|---|
IconName | ImageMoniker | Да | Вы можете использовать пользовательский моникер для изображения, добавленного после раздела "Добавление пользовательских образов " или ссылаться на visual Studio ImageMoniker , например ImageMonikers.KnownValues.AddItem |
Значок Параметры | Значок Параметры | Да | Настраивает отображение команды. Например IconSettings.IconAndText , отображает значок рядом с отображаемым именем команды, в то время как IconSettings.IconOnly отображается только значок команды, а не displayName, если он родительский элемент на панели инструментов. |
Пример ImageMoniker.KnownValues
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%")
{
Icon = new CommandIconConfiguration(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
};
Использование пользовательского образа для значка команды
Вы можете добавить пользовательские изображения, на которые можно ссылаться с помощью пользовательских моникеров, выполнив следующие действия.
- Переименуйте исходные файлы изображения, чтобы следовать шаблону
%Custom Moniker%.*
(например, MyImage.1.png). Файлы, префиксированные с тем же моникером, будут использоваться в качестве резервных источников для одного и того же пользовательского моникера. Другой источник будет использоваться на основе запрошенного размера значка.- Например, MyImage.16.16.png (16*16 png), MyImage.20.20.png (20*20 png) и MyImage.xaml все считаются источниками.
MyImage
- Если запрошенный размер значка равен 16*16, будет использоваться MyImage.16.16.png, если запрошенный размер равен 20*20, MyImage.20.20.png будет использоваться во всех остальных случаях MyImage.xaml.
- Например, MyImage.16.16.png (16*16 png), MyImage.20.20.png (20*20 png) и MyImage.xaml все считаются источниками.
- Поместите все исходные файлы образа в
Images
папку.- Папка ресурсов
Images
образа по умолчанию, но ее можно также настроить, добавив его.<ImageAssetsPath>%YourFolder%</ImageAssetsPath>
- Папка ресурсов
Пример ImageMoniker.Custom
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%")
{
Icon = new CommandIconConfiguration(ImageMoniker.Custom("MyImage"), IconSettings.IconAndText),
};
Ярлыки
Команды можно настроить для выполнения при использовании определенного сочетания ключей. Ярлык состоит из одного или двух аккордов, где каждый аккорд состоит из ModifierKey
одного и одного Key
. Возможные значения: ModifierKey
LeftAlt
, Shift
, , ControlShift
ControlShiftLeftAlt
Control
и None
, где None
допустимы только при использовании во втором аккорде ярлыка. То же ModifierKey
самое не нужно использовать для обоих аккордов в сочетании клавиш. Используемый Key
в аккорде может быть почти любой другой клавишей клавиатуры.
Многие сочетания клавиш уже используются в Visual Studio. Не следует назначать один и тот же ярлык нескольким командам, так как повторяющиеся привязки трудно обнаружить, а также может привести к непредсказуемым результатам. Поэтому рекомендуется проверить доступность ярлыка перед назначением.
Ограничение сочетания клавиш
Ограничение активации можно включить в конфигурацию, чтобы ярлык был доступен в разных контекстах. Эти ограничения активации определяются в виде редактора Guid
и обычно относятся к редактору. Если ярлык предоставляет ограничение активации, он будет доступен только в этом конкретном контексте. Например, используйте Guid
"{5EFC7975-14BC-11CF-9B2B-00AA00573819}", чтобы сделать ярлык доступным в редакторе Visual Studio. В этом случае ярлык будет доступен только при фокусе редактора Visual Studio.
Пример ярлыка
public override CommandConfiguration CommandConfiguration => new("%MyCommand.DisplayName%")
{
Shortcuts = new CommandShortcutConfiguration[]
{
new(ModifierKey.LeftAlt, Key.M),
new(ModifierKey.ControlShift, Key.Y, ModifierKey.ControlShift, Key.B),
},
};
Настройка команды
Вы можете настроить видимость и состояние включенной или отключенной команды и задать дополнительные метаданные с помощью флагов.
Visibility
Видимость команды можно контролировать, задав VisibleWhen
свойство в команде CommandConfiguration
.
Атрибут поддерживает указание условия с помощью ряда отдельных параметров, которые вместе указывают условие и все его логику и входные данные. Чтобы указать условие, необходимо указать выражение в одном параметре, определить набор терминов (строк), используемых в выражении в другом параметре, и какие значения эти термины следует заменить при оценке в третьем параметре. Сочетание выражения, терминов и значений называется ограничением активации на основе правил и полностью описано в ограничениях активации на основе правил.
Если это свойство не указано в конфигурации, по умолчанию команда всегда отображается.
Пример видимости
public override CommandConfiguration CommandConfiguration => new("My command")
{
VisibleWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.(jpg|jpeg|txt)$"),
};
Состояние "Включено/отключено"
Состояние включенной или отключенной команды можно контролировать, задав EnabledWhen
свойство в команде CommandConfiguration
.
Этот тип конфигурации называется ограничением активации на основе правил и полностью описан в ограничениях активации на основе правил.
Если эта конфигурация опущена из команды, по умолчанию команда всегда будет включена. Вы также можете автоматически отключить команду, если она выполняется в данный момент, задав this.DisableDuringExecution = true;
конструктор класса команд. Установка этого свойства переопределяет состояние включено или отключено, определенное EnabledWhen
конфигурацией во время выполнения команды.
Пример состояния включено или отключено
public override CommandConfiguration CommandConfiguration => new("My command")
{
EnabledWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.(jpg|jpeg|txt)$"),
};
Дополнительные сведения о допустимых значениях терминов см. в разделе ограничения активации на основе правил.
Флаги команд
Флаги команд помогают определить дополнительные свойства в командах, которые используются во время выполнения для определения специальных действий, которые могут иметь ваша команда. Поддерживаемые в настоящее время флаги:
CanToggle
— Указывает, чтоIsChecked
свойство команды может измениться, чтобы средства чтения с экрана могли правильно объявить команду. Функционально это гарантирует, что свойствоIsTogglePatternAvailable
автоматизации возвращает значение true для элемента пользовательского интерфейса.CanSelect
— Указывает, чтоIsChecked
свойство команды может измениться, чтобы средства чтения с экрана могли правильно объявить команду. Функционально это гарантирует, что свойствоIsSelectionPatternAvailable
автоматизации возвращает значение true для элемента пользовательского интерфейса.
Изменение отображаемого имени команды
Хотя отображаемое имя для команды изначально задано ( CommandConfiguration
см. раздел "Создание команды"), его можно изменить во время выполнения, задав DisplayName
свойство в команде. Свойство ToolTipText
можно обновить аналогичным образом.
Пример изменения DisplayName
[VisualStudioContribution]
public class MyCommand : Command
{
/// <inheritdoc />
public override CommandConfiguration CommandConfiguration => new("Initial Display Name");
public MyCommand(VisualStudioExtensibility extensibility)
: base(extensibility)
{
}
public override Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
// Update the command's Display Name
this.DisplayName = "Updated Display Name";
return Task.CompletedTask;
}
}
Следующие шаги
- Следуйте инструкциям по созданию раздела проекта в разделе "Начало работы".
- Ознакомьтесь с документацией по настройке меню и панелей инструментов
- Далее см . пример InsertGuidSample для более полного просмотра создания расширения с помощью команды.
- См. пример родительской команды в CommandParentingSample.