MenuCommand и OleMenuCommand Microsoft Docs

Публикувано: февруари 2016 г

Можете да създавате команди от менюто въз основа на обект MenuCommand или OleMenuCommand и да внедрявате подходящите манипулатори на събития. В повечето случаи можете да използвате MenuCommand, както прави шаблонът на проекта VSPackage, но понякога може да искате да използвате OleMenuCommand.

Командите, които VSPackage прави достъпни за IDE, трябва да бъдат видими и активирани, за да може потребителят да ги използва. Ако командите са създадени в .vsct файл с помощта на шаблона на Visual Studio Package за проекти, те са видими и активирани по подразбиране. Чрез задаване на някои командни флагове, катоDynamicItemStart, това поведение по подразбиране може да бъде променено. Видимостта, включването и други свойства на команда също могат да бъдат променени в кода по време на изпълнение чрез достъп до обекта OleMenuCommand, свързан с командата.

Необходими компоненти

За да завършите това ръководство, трябва да инсталирате Visual Studio SDK. Вижте Visual Studio SDK за повече информация.

Местоположения за шаблон на пакет на Visual Studio

Шаблонът на Visual Studio Package може да бъде намерен в диалоговия прозорецНов проект чрез разширяване на възлитеVisual Basic/Разширение (разширение на Visual Basic/околна среда),C#/разширяемост илиДруги типове проекти/разширение на среда.

Създаване на екип

Всички команди, командни групи, менюта, ленти с инструменти и прозорци с инструменти са дефинирани в .vsct файл. За повече информация вижте Visual Studio Command Tables (.vsct файлове).

Ако създавате VSPackage с помощта на шаблон на пакет, изберетеКоманда от менюто, за да създадете .vsct файл и дефинирайте команда от менюто чрезпо подразбиране. За повече информация вижте Създаване на разширение с помощта на команда от менюто.

Добавяне на команда към IDE

В секциятаСимволи намерете елемента GuidSymbol, съдържащ групи и команди.

Създайте IDSymbol елемент за всяко меню, група и команда, които искате да добавите, както е показано в следния пример.

Атрибутитеname на елементитеGuidSymbol иIDSymbol предоставят двойка GUID:ID за всяко ново меню, група или команда.guid представлява набор от команди, дефинирани за вашия VSPackage. Можете да дефинирате множество набори от команди. Всяка двойка GUID:ID трябва да бъде уникална.

В секцията Бутони създайте елемент Бутон, за да дефинирате командата, както е показано в следния пример.

Задайте полетатаguid иid така, че да съответстват на GUID:ID на новата команда.

Задайте атрибутаpriority.

Атрибутътpriority се използва от файла .vsct за определяне на местоположението на бутона сред другите обекти в родителската група.

Командите с по-нисък приоритет се появяват над или отляво на командите с по-висок приоритет. Позволени са еднакви стойности на приоритет, но относителното позициониране на команди със същия приоритет се определя от реда, в който VSPackages се обработват по време на изпълнение, и този ред не може да бъде предварително определен.

Ако атрибутътpriority е пропуснат, той получава стойност 0.

Задайте атрибутаtype. В повечето случаи неговата стойност ще бъде"Button". За други валидни типове бутони вижте Елемент на бутон.

В дефиницията на бутона създайте елемент Strings, който включва елемент ButtonText, който съдържа името на менюто, показано в IDE, и елемент CommandName,който съдържа името на командата, използвана за достъп до това меню в прозорецаКоманда.

Ако текстовият низ на бутона съдържа знака &, потребителят може да отвори менюто, като натисне клавиша ALT и клавиша, посочен след знака &.

Когато добавите елементTooltip, текстът, който съдържа, ще се покаже, когато потребителят задържи курсора на мишката над бутона.

Добавете елемент на икона, за да посочите иконата, която да се показва с командата. Иконите са необходими за бутоните на лентата с инструменти, но не и за елементите от менюто. Полетатаguid иid на елементаIcon трябва да съответстват на тези на елемента Bitmap, дефиниран в разделаBitmaps.

Добавете командни флагове, за да промените съответно външния вид и поведението на бутона. За да направите това, добавете елемент CommandFlag към дефиницията на менюто.

В зависимост от проекта, това може да стане по един от двата начина.

В елементаButton създайте родителски елемент и посочете в неговите полетаguid иid Guid и ID (идентификатор) на групата, където ще бъде разположена командата, наричана още основна родителска група.

Следващият пример указва команда, която да се показва в дефинирано от потребителя меню.

Можете да пропуснете елементаParent, ако командата трябва да бъде поставена чрез функцията за поставяне на команда. Създайте елемент CommandPlacements преди секциятаSymbols и добавете елемент CommandPlacement, който има командиguid иid,priority и родителски обект, както е показано в следния пример.

Ако създадете множество разположения на команди, които имат еднакви двойки GUID:ID и различни родителски групи, менюто ще се появи на множество места. Вижте описанието на артикула за повече подробностиCommandPlacements.

За повече информация относно родителските връзки и командните групи вижте Създаване на групи бутони за многократна употреба.

В този момент командата ще се появи в IDE, но няма да има никаква функционалност. Ако команда е създадена с помощта на шаблон на пакет, по подразбиране тя ще има манипулатор на щракване, който показва съобщение.

Обработване на нова команда

Повечето команди в управлявания код могат да бъдат обработени в Managed Package Framework (MPF) чрез картографиране на командата към обект MenuCommand или OleMenuCommand и прилагане на подходящите манипулатори на събития.

За код, който използва интерфейса IOleCommandTarget директно за обработка на команди, трябва да внедрите интерфейса IOleCommandTarget и неговите методи. Двата най-важни метода са QueryStatus и Exec.

Вземете екземпляр на OleMenuCommandService, както е показано в следния пример.

Създайте обект CommandID, който има като параметри GUID и ID (идентификатор) на командата за обработка, както е показано в следния пример.

Шаблонът на пакет Visual Studio предоставя две колекции, GuidList и PkgCmdIDList, за съхраняване на GUID и идентификатори на команди. За команди, които са добавени с помощта на шаблон, те се попълват автоматично, но за команди, добавени ръчно, трябва също да добавите ID запис към класа PkgCmdIdList.

Като алтернатива можете да попълните обекта CommandID, като използвате стойността на оригиналния низ на GUID и целочислената стойност на ID.

Създайте екземпляр на обект MenuCommand или OleMenuCommand, който дефинира метод, който обработва командата заедно с CommandID, както е показано в следния пример.

За статични команди, MenuCommand е добре. За динамично показване на елементи от менютоНеобходими са манипулатори на събития QueryStatus OleMenuCommand добавя събитие BeforeQueryStatus, което се задейства, когато се отвори главното меню на командата, и някои други свойства, като Text.

Командите, генерирани от шаблона на проекта, се предават по подразбиране към обекта OleMenuCommand на метода Initialize() на класа пакет.

За статични команди, MenuCommand е добре. Динамичното показване на елементи от менюто изисква манипулатори на събития QueryStatus OleMenuCommand добавя събитие BeforeQueryStatus, което се задейства, когато се отвори главното меню на командата, и някои други свойства, като Text.

Командите, генерирани от шаблона на проекта, се предават по подразбиране към обекта OleMenuCommand на метода Initialize() на класа пакет. Съветникът на Visual Studio имплементира метода Initialize с MenuCommand. За да покажете динамично елемент от менюто, трябва да промените това на OleMenuCommand, както е показано в следващата стъпка. Освен това, за да промените текста на елемент от менюто, трябва да добавите командния флаг TextChanges към командния бутон на менюто във файла .vsct, както е показано в следващия пример.

Предайте новата команда на менюто към метода AddCommand на интерфейса IMenuCommandService. За команди, създадени от шаблона на проекта, това се прави по подразбиране, както е показано в следващия пример.

Приложете метода, който обработва командата.

Внедряване на QueryStatus

Събитието QueryStatus възниква преди показването на командата. Това ви позволява да зададете свойствата на дадена команда в манипулатора на събития, преди потребителят да получи достъп до командата. Този метод е достъпен само за команди, които са добавени като обекти OleMenuCommand.

Добавете обектEventHandler към събитието BeforeQueryStatus в обекта OleMenuCommand, създаден за обработка на командата,както е показано в следния пример (menuItem е екземпляр на OleMenuCommand).

ОбектътEventHandler получава името на метода, който се извиква, когато се поиска състоянието на командата от менюто.

Приложете метод за обработка на състояние на заявка за командата. Параметърът изпращачobject може да бъде прехвърлен към обект OleMenuCommand, който се използва за задаване на различни атрибути на командата от менюто, включително нейния текст. Следващата таблица показва свойствата в класа MenuCommand (от който е извлечен класът OleMenuCommand MPF), които съответстват на OLECMDF флаговете.