c# – VS 2015动态菜单命令不像宣传的那样工作
我正在尝试在VS 2015扩展中创建动态菜单项.我能做的最好的事情是让占位符命令可见并处于活动状态.这是我可以从VS向导开始创建的最小的示例(对不起长度,但它确实是我可以创建的最小的示例):
Command1Package.cs: using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using System; using System.ComponentModel.Design; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; namespace minimal { [PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration("#110","#112","1.0",IconResourceID = 400)] // Info on this package for Help/About [ProvideMenuResource("Menus.ctmenu",1)] [Guid(Command1Package.PackageGuidString)] [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] [SuppressMessage("StyleCop.CSharp.DocumentationRules","SA1650:ElementDocumentationMustBeSpelledCorrectly",Justification = "pkgdef,VS and vsixmanifest are valid VS terms")] public sealed class Command1Package : Package { public const string PackageGuidString = "3e88287b-7b79-403d-ae8d-3329af218869"; public Command1Package() { } #region Package Members protected override void Initialize() { Debug.WriteLine("minimal package instantiated"); Command1.Initialize(this,GetService(typeof(IMenuCommandService)) as OleMenuCommandService); base.Initialize(); } #endregion } } Command1.cs: using Microsoft.VisualStudio.Shell; using System; using System.ComponentModel.Design; using System.Diagnostics; namespace minimal { internal sealed class Command1 { public static readonly Guid CommandSet = new Guid("c1388361-6429-452c-8ba0-580d292ef0ca"); private Command1() { } public static void Initialize(Package package,OleMenuCommandService mcs) { AddOneCommand(mcs,0x0100,"Renamed placeholder command"); // the placeholder AddOneCommand(mcs,0x0101,"Dynamic command 1"); // a dynamic command AddOneCommand(mcs,0x0102,"Dynamic command 2"); } internal static void AddOneCommand(OleMenuCommandService mcs,uint cmdid,string cmdname) { Debug.WriteLine("AddOneCommand" + cmdid.ToString("X4")); CommandID id = new CommandID(CommandSet,(int) cmdid); OleMenuCommand mc = new OleMenuCommand(new EventHandler(MenuItemCallback),id,cmdname); mc.BeforeQueryStatus += OnBeforeQueryStatus; mcs.AddCommand(mc); } private static void OnBeforeQueryStatus(object sender,EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; Debug.WriteLine("OnBeforeQueryStatus called for " + mc.CommandID.ToString()); } private static void MenuItemCallback(object sender,EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; System.Windows.Forms.MessageBox.Show("MenuItemCallback called for " + mc.CommandID.ToString()); } } } Command1Package.vsct: <?xml version="1.0" encoding="utf-8"?> <CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <Extern href="stdidcmd.h"/> <Extern href="vsshlids.h"/> <Commands package="guidCommand1Package"> <Groups> <Group guid="guidCommand1PackageCmdSet" id="MyMenuGroup" priority="0x0600"> <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/> </Group> <Group guid="guidCommand1PackageCmdSet" id="MyMenuSubgroup" priority="0x0100"> <Parent guid="guidCommand1PackageCmdSet" id="SubMenu"/> </Group> </Groups> <Menus> <Menu guid="guidCommand1PackageCmdSet" id="SubMenu" priority="0x0100" type="Menu"> <Parent guid="guidCommand1PackageCmdSet" id="MyMenuGroup"/> <Strings> <ButtonText>Minimal commands</ButtonText> <CommandName>MinimalCommands</CommandName> </Strings> </Menu> </Menus> <Buttons> <Button guid="guidCommand1PackageCmdSet" id="Command1Id" priority="0x0100" type="Button"> <Parent guid="guidCommand1PackageCmdSet" id="MyMenuSubgroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <CommandFlag>TextChanges</CommandFlag> <CommandFlag>DynamicVisibility</CommandFlag> <Strings> <ButtonText>Invoke Command1</ButtonText> <CommandName>Command1</CommandName> </Strings> </Button> </Buttons> </Commands> <Symbols> <GuidSymbol name="guidCommand1Package" value="{3e88287b-7b79-403d-ae8d-3329af218869}" /> <GuidSymbol name="guidCommand1PackageCmdSet" value="{c1388361-6429-452c-8ba0-580d292ef0ca}"> <IDSymbol name="MyMenuGroup" value="0x1020" /> <IDSymbol name="MyMenuSubgroup" value="0x1021"/> <IDSymbol name="SubMenu" value="0x200"/> <IDSymbol name="Command1Id" value="0x0100" /> </GuidSymbol> </Symbols> </CommandTable> 一些观察: >如果包中没有[ProvideAutoLoad]属性,则在执行占位符命令之前,框架不会实例化包,该命令是该子菜单上唯一的项目.似乎VS向导生成的代码应该为您执行此操作,因为在Package类的帮助条目中未提及此属性(以及许多其他属性). 解决方法
是的,它比MFC难得多.
>确实需要[ProvideAutoLoad]. AddOneCommand(mcs,“动态命令1”); 通常你添加< CommandFlag> DefaultInvisible< / CommandFlag>到DynamicItemStart命令并在OnBeforeQueryStatus处理程序中设置menuCommand.Text和menuCommand.Visible. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- xcode – 在Snow Leopard上安装Mac OS X SDK 10.5
- ArcGIS API for Flex制作程序发布后出现错误:"访问 UR
- 如何计时oracle选择查询
- u-boot-2014.10移植第16天----Nor flash启动
- jaxb – 编组XML/JSON时,Jersey/JAX-RS注释是否可以跳过类成
- 在引入Oracle插入触发器的WHEN原因中,引用OLD的内容是什么?
- 查看oracle数据库的连接数以及用户
- ruby-on-rails – 有人可以解释class << self给我吗?
- 莫名其妙的出现这个错,看了logcat 说是什么二进制xml错误啥
- 用Flex的编译参数实现AS3程序的自身预加载(Self Preloading