Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Visual Studio komut tablosu (.vsct) dosyasındaki bir yer tutucu düğme tanımında komut bayrağını belirterekDynamicItemStart, ardından (kodda) komutların görüntüleneceği ve işleneceği menü öğelerinin sayısını tanımlayarak çalışma zamanında menü öğeleri ekleyebilirsiniz. VSPackage yüklendiğinde, yer tutucu dinamik menü öğeleriyle değiştirilir.
Visual Studio, en son açılan belgelerin adlarını görüntüleyen En Son Kullanılan (MRU) listesinde dinamik listeleri ve açık olan pencerelerin adlarını görüntüleyen Windows listesini kullanır. DynamicItemStart Komut tanımındaki bayrak, VSPackage açılana kadar komutun bir yer tutucu olduğunu belirtir. VSPackage açıldığında, yer tutucu çalışma zamanında oluşturulan ve dinamik listeye eklenen 0 veya daha fazla komutla değiştirilir. VSPackage açılana kadar menüde dinamik listenin göründüğü konumu göremeyebilirsiniz. Visual Studio, dinamik listeyi doldurmak için VSPackage'dan ilk karakterleri yer tutucunun kimliğiyle aynı olan kimliği olan bir komut aramasını ister. Visual Studio eşleşen bir komut bulduğunda, komutun adını dinamik listeye ekler. Ardından kimliği artırır ve başka dinamik komut kalmayıncaya kadar dinamik listeye eklenecek başka bir eşleşen komut arar.
Bu kılavuzda, Çözüm Gezgini araç çubuğundaki bir komutla visual studio çözümünde başlangıç projesinin nasıl ayarlanacağı gösterilmektedir. Etkin çözümdeki projelerin dinamik açılan listesine sahip bir menü denetleyicisi kullanır. Hiçbir çözüm açık olmadığında veya açık çözümde yalnızca bir proje olduğunda bu komutun görünmesinin engellenmesi için VSPackage yalnızca bir çözümün birden çok projesi olduğunda yüklenir.
.vsct dosyaları hakkında daha fazla bilgi için bkz. Visual Studio komut tablosu (.vsct) dosyaları.
Menü komutuyla uzantı oluşturma
adlı
DynamicMenuItemsbir VSIX projesi oluşturun.Proje açıldığında özel bir komut öğesi şablonu ekleyin ve DynamicMenu olarak adlandırın. Daha fazla bilgi için bkz . Menü komutuyla uzantı oluşturma.
.vsct dosyasındaki öğeleri ayarlama
Bir araç çubuğunda dinamik menü öğeleri olan bir menü denetleyicisi oluşturmak için aşağıdaki öğeleri belirtirsiniz:
Biri menü denetleyicisini, diğeri de açılan listede menü öğelerini içeren iki komut grubu
Türünde bir menü öğesi
MenuControllerBiri menü öğeleri için yer tutucu işlevi gören iki düğme, diğeri ise araç çubuğundaki simgeyi ve araç ipucunı sağlar.
DynamicMenuPackage.vsct dosyasında, komut kimliklerini tanımlayın. Simgeler bölümüne gidin ve guidDynamicMenuPackageCmdSet GuidSymbol bloğundaki IDSymbol öğelerini değiştirin. İki grup, menü denetleyicisi, yer tutucu komutu ve tutturucu komutu için IDSymbol öğeleri tanımlamanız gerekir.
<GuidSymbol name="guidDynamicMenuPackageCmdSet" value="{ your GUID here }"> <IDSymbol name="MyToolbarItemGroup" value="0x1020" /> <IDSymbol name="MyMenuControllerGroup" value="0x1025" /> <IDSymbol name="MyMenuController" value ="0x1030"/> <IDSymbol name="cmdidMyAnchorCommand" value="0x0103" /> <!-- NOTE: The following command expands at run time to some number of ids. Try not to place command ids after it (e.g. 0x0105, 0x0106). If you must add a command id after it, make the gap very large (e.g. 0x200) --> <IDSymbol name="cmdidMyDynamicStartCommand" value="0x0104" /> </GuidSymbol>Gruplar bölümünde var olan grupları silin ve az önce tanımladığınız iki grubu ekleyin:
<Groups> <!-- The group that adds the MenuController on the Solution Explorer toolbar. The 0x4000 priority adds this group after the group that contains the Preview Selected Items button, which is normally at the far right of the toolbar. --> <Group guid="guidDynamicMenuPackageCmdSet" id="MyToolbarItemGroup" priority="0x4000" > <Parent guid="guidSHLMainMenu" id="IDM_VS_TOOL_PROJWIN" /> </Group> <!-- The group for the items on the MenuController drop-down. It is added to the MenuController submenu. --> <Group guid="guidDynamicMenuPackageCmdSet" id="MyMenuControllerGroup" priority="0x4000" > <Parent guid="guidDynamicMenuPackageCmdSet" id="MyMenuController" /> </Group> </Groups>MenuController'i ekleyin. Her zaman görünür olmadığından DynamicVisibility komut bayrağını ayarlayın. ButtonText görüntülenmez.
<Menus> <!-- The MenuController to display on the Solution Explorer toolbar. Place it in the ToolbarItemGroup.--> <Menu guid="guidDynamicMenuPackageCmdSet" id="MyMenuController" priority="0x1000" type="MenuController"> <Parent guid="guidDynamicMenuPackageCmdSet" id="MyToolbarItemGroup" /> <CommandFlag>DynamicVisibility</CommandFlag> <Strings> <ButtonText></ButtonText> </Strings> </Menu> </Menus>Biri dinamik menü öğeleri için yer tutucu, diğeri de MenuController için yer tutucu olarak olmak üzere iki düğme ekleyin.
Yer tutucu düğmesinin üst öğesi MyMenuControllerGroup'tır. Yer tutucu düğmesine DynamicItemStart, DynamicVisibility ve TextChanges komut bayraklarını ekleyin. ButtonText görüntülenmez.
Tutturucu düğmesi simgeyi ve araç ipucu metnini tutar. Tutturucu düğmesinin üst öğesi de MyMenuControllerGroup'tır. Düğmenin gerçekten menü denetleyicisi açılan listesinde görünmediğinden emin olmak için NoShowOnMenuController komut bayrağını ve kalıcı yer işareti yapmak için FixMenuController komut bayrağını eklersiniz.
<!-- The placeholder for the dynamic items that expand to N items at run time. --> <Buttons> <Button guid="guidDynamicMenuPackageCmdSet" id="cmdidMyDynamicStartCommand" priority="0x1000" > <Parent guid="guidDynamicMenuPackageCmdSet" id="MyMenuControllerGroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <CommandFlag>DynamicVisibility</CommandFlag> <CommandFlag>TextChanges</CommandFlag> <!-- This text does not appear. --> <Strings> <ButtonText>Project</ButtonText> </Strings> </Button> <!-- The anchor item to supply the icon/tooltip for the MenuController --> <Button guid="guidDynamicMenuPackageCmdSet" id="cmdidMyAnchorCommand" priority="0x0000" > <Parent guid="guidDynamicMenuPackageCmdSet" id="MyMenuControllerGroup" /> <!-- This is the icon that appears on the Solution Explorer toolbar. --> <Icon guid="guidImages" id="bmpPicArrows"/> <!-- Do not show on the menu controller's drop down list--> <CommandFlag>NoShowOnMenuController</CommandFlag> <!-- Become the permanent anchor item for the menu controller --> <CommandFlag>FixMenuController</CommandFlag> <!-- The text that appears in the tooltip.--> <Strings> <ButtonText>Set Startup Project</ButtonText> </Strings> </Button> </Buttons>Projeye bir simge ekleyin ( Kaynaklar klasörüne) ve ardından başvuruyu .vsct dosyasına ekleyin. Bu kılavuzda, proje şablonuna eklenen Oklar simgesini kullanacağız.
Simgeler bölümünün hemen önüne Komutlar bölümünün dışında bir VisibilityConstraints bölümü ekleyin. (Simgeler'den sonra eklerseniz bir uyarı alabilirsiniz.) Bu bölüm, menü denetleyicisinin yalnızca birden çok proje içeren bir çözüm yüklendiğinde görünmesini sağlar.
<VisibilityConstraints> <!--Make the MenuController show up only when there is a solution with more than one project loaded--> <VisibilityItem guid="guidDynamicMenuPackageCmdSet" id="MyMenuController" context="UICONTEXT_SolutionHasMultipleProjects"/> </VisibilityConstraints>
Dinamik menü komutunu uygulama
öğesinden OleMenuCommanddevralan bir dinamik menü komut sınıfı oluşturursunuz. Bu uygulamada, oluşturucu eşleşen komutlar için kullanılacak bir koşul belirtir. Çağrılacak komutu tanımlayan özelliğini ayarlamak MatchedCommandId için bu koşulu kullanmak için yöntemini geçersiz kılmalısınızDynamicItemMatch.
DynamicItemMenuCommand.cs adlı yeni bir C# sınıf dosyası oluşturun ve öğesinden OleMenuCommanddevralan DynamicItemMenuCommand adlı bir sınıf ekleyin:
class DynamicItemMenuCommand : OleMenuCommand { }Aşağıdaki kullanım yönergelerini ekleyin:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using System.ComponentModel.Design;Eşleşme koşulunu depolamak için özel bir alan ekleyin:
private Predicate<int> matches;Oluşturucudan OleMenuCommand devralan ve bir komut işleyicisi ile işleyici belirten bir BeforeQueryStatus oluşturucu ekleyin. Komutu eşleştirmek için bir koşul ekleyin:
public DynamicItemMenuCommand(CommandID rootId, Predicate<int> matches, EventHandler invokeHandler, EventHandler beforeQueryStatusHandler) : base(invokeHandler, null /*changeHandler*/, beforeQueryStatusHandler, rootId) { if (matches == null) { throw new ArgumentNullException("matches"); } this.matches = matches; }eşleşme koşulunu DynamicItemMatch çağırıp özelliğini ayarlaması MatchedCommandId için yöntemini geçersiz kılın:
public override bool DynamicItemMatch(int cmdId) { // Call the supplied predicate to test whether the given cmdId is a match. // If it is, store the command id in MatchedCommandid // for use by any BeforeQueryStatus handlers, and then return that it is a match. // Otherwise clear any previously stored matched cmdId and return that it is not a match. if (this.matches(cmdId)) { this.MatchedCommandId = cmdId; return true; } this.MatchedCommandId = 0; return false; }
Komutu ekleme
DynamicMenu oluşturucu, dinamik menüler ve menü öğeleri de dahil olmak üzere menü komutlarını ayarladığınız yerdir.
DynamicMenuPackage.cs dosyasında, komut kümesinin GUID'sini ve komut kimliğini ekleyin:
public const string guidDynamicMenuPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file public const uint cmdidMyCommand = 0x104;DynamicMenu.cs dosyasına aşağıdaki using yönergelerini ekleyin:
using EnvDTE; using EnvDTE80; using System.ComponentModel.Design;DynamicMenusınıfında özel bir dte2 alanı ekleyin.private DTE2 dte2;Özel rootItemId alanı ekleyin:
private int rootItemId = 0;DynamicMenu oluşturucusunda menü komutunu ekleyin. Sonraki bölümde komut işleyicisini, olay işleyicisini
BeforeQueryStatusve eşleşme koşulunu tanımlayacağız.private DynamicMenu(Package package) { if (package == null) { throw new ArgumentNullException(nameof(package)); } this.package = package; OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (commandService != null) { // Add the DynamicItemMenuCommand for the expansion of the root item into N items at run time. CommandID dynamicItemRootId = new CommandID( new Guid(DynamicMenuPackageGuids.guidDynamicMenuPackageCmdSet), (int)DynamicMenuPackageGuids.cmdidMyCommand); DynamicItemMenuCommand dynamicMenuCommand = new DynamicItemMenuCommand( dynamicItemRootId, IsValidDynamicItem, OnInvokedDynamicItem, OnBeforeQueryStatusDynamicItem); commandService.AddCommand(dynamicMenuCommand); } this.dte2 = (DTE2)this.ServiceProvider.GetService(typeof(DTE)); }
İşleyicileri uygulama
Bir menü denetleyicisinde dinamik menü öğeleri uygulamak için, bir dinamik öğeye tıklandığında komutu işlemeniz gerekir. Menü öğesinin durumunu ayarlayan mantığı da uygulamanız gerekir. İşleyicileri sınıfına DynamicMenu ekleyin.
Başlangıç Projesini Ayarla komutunu uygulamak için OnInvokedDynamicItem olay işleyicisini ekleyin. Adı çağrılan komutun metniyle aynı olan projeyi arar ve özelliğindeki StartupProjects mutlak yolunu ayarlayarak başlangıç projesi olarak ayarlar.
private void OnInvokedDynamicItem(object sender, EventArgs args) { DynamicItemMenuCommand invokedCommand = (DynamicItemMenuCommand)sender; // If the command is already checked, we don't need to do anything if (invokedCommand.Checked) return; // Find the project that corresponds to the command text and set it as the startup project var projects = dte2.Solution.Projects; foreach (Project proj in projects) { if (invokedCommand.Text.Equals(proj.Name)) { dte2.Solution.SolutionBuild.StartupProjects = proj.FullName; return; } } }Olay işleyicisini
OnBeforeQueryStatusDynamicItemekleyin. Bu, birQueryStatusolaydan önce çağrılan işleyicidir. Menü öğesinin yer tutucu öğe değil de "gerçek" bir öğe olup olmadığını ve öğenin zaten işaretli olup olmadığını (projenin zaten başlangıç projesi olarak ayarlandığı anlamına gelir) belirler.private void OnBeforeQueryStatusDynamicItem(object sender, EventArgs args) { DynamicItemMenuCommand matchedCommand = (DynamicItemMenuCommand)sender; matchedCommand.Enabled = true; matchedCommand.Visible = true; // Find out whether the command ID is 0, which is the ID of the root item. // If it is the root item, it matches the constructed DynamicItemMenuCommand, // and IsValidDynamicItem won't be called. bool isRootItem = (matchedCommand.MatchedCommandId == 0); // The index is set to 1 rather than 0 because the Solution.Projects collection is 1-based. int indexForDisplay = (isRootItem ? 1 : (matchedCommand.MatchedCommandId - (int) DynamicMenuPackageGuids.cmdidMyCommand) + 1); matchedCommand.Text = dte2.Solution.Projects.Item(indexForDisplay).Name; Array startupProjects = (Array)dte2.Solution.SolutionBuild.StartupProjects; string startupProject = System.IO.Path.GetFileNameWithoutExtension((string)startupProjects.GetValue(0)); // Check the command if it isn't checked already selected matchedCommand.Checked = (matchedCommand.Text == startupProject); // Clear the ID because we are done with this item. matchedCommand.MatchedCommandId = 0; }
Komut kimliği eşleşme koşulunu uygulama
Şimdi eşleştirme koşulunu uygulayın. İki şeyi belirlememiz gerekir: ilk olarak, komut kimliğinin geçerli olup olmadığı (bildirilen komut kimliğinden büyük veya buna eşit) ve ikinci olarak da olası bir proje belirtip belirtmediğini (çözümdeki proje sayısından küçük) belirlememiz gerekir.
private bool IsValidDynamicItem(int commandId)
{
// The match is valid if the command ID is >= the id of our root dynamic start item
// and the command ID minus the ID of our root dynamic start item
// is less than or equal to the number of projects in the solution.
return (commandId >= (int)DynamicMenuPackageGuids.cmdidMyCommand) && ((commandId - (int)DynamicMenuPackageGuids.cmdidMyCommand) < dte2.Solution.Projects.Count);
}
VSPackage'ı yalnızca bir çözümün birden çok projesi olduğunda yüklenecek şekilde ayarlama
Etkin çözümün birden fazla projesi olmadığı sürece Başlangıç Projesini Ayarla komutu anlamlı olmadığından, VSPackage'ınızı yalnızca bu durumda otomatik yüklenecek şekilde ayarlayabilirsiniz. kullanıcı arabirimi bağlamı SolutionHasMultipleProjectsile birlikte kullanırsınızProvideAutoLoadAttribute. DynamicMenuPackage.cs dosyasında DynamicMenuPackage sınıfına aşağıdaki öznitelikleri ekleyin:
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[ProvideMenuResource("Menus.ctmenu", 1)]
[ProvideAutoLoad(UIContextGuids.SolutionHasMultipleProjects)]
[Guid(DynamicMenuPackage.PackageGuidString)]
public sealed class DynamicMenuItemsPackage : Package
{}
Başlangıç projesini ayarla komutunu test etme
Artık kodunuzu test edebilirsiniz.
Projeyi derleyin ve hata ayıklamaya başlayın. Deneysel örnek görünmelidir.
Deneysel örnekte, birden fazla projesi olan bir çözüm açın.
Çözüm Gezgini araç çubuğunda ok simgesini görmeniz gerekir. Genişlettiğinizde, çözümdeki farklı projeleri temsil eden menü öğeleri görünmelidir.
Projelerden birini denetlediğinizde, başlangıç projesi olur.
Çözümü kapattığınızda veya yalnızca bir projesi olan bir çözümü açtığınızda araç çubuğu simgesi kaybolmalıdır.