In meiner VS-Erweiterung muss ich einen Menüpunkt für meinen neuen Projekttyp hinzufügen. Aber ich möchte, dass es nur für meinen benutzerdefinierten Typ angezeigt wird. So habe ich diesen Code-Datei .vcst:Dynamische Sichtbarkeit des Menüpunktes
<Button guid="_Interactive_WindowCmdSet" id="cmdidLoadUI" priority="0x0100" type="Button">
<Parent guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<CommandFlag>DynamicVisibility</CommandFlag>
<Strings>
<ButtonText>Load</ButtonText>
</Strings>
</Button>
<Group guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" priority="0x0600">
<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/>
</Group>
Und hinzugefügt diesen Code Initialisierung zu verpacken:
// Create the command for the menu item.
CommandID projectMenuCommandID = new CommandID(GuidList.Interactive_WindowCmdSet, (int)PkgCmdIDList.cmdidLoadUI);
OleMenuCommand projectmenuItem = new OleMenuCommand(LoadUIMenuItemCallback, projectMenuCommandID);
projectmenuItem.BeforeQueryStatus += projectmenuItem_BeforeQueryStatus;
mcs.AddCommand(projectmenuItem);
und Abfrage-Status-Handler ist:
private void projectmenuItem_BeforeQueryStatus(object sender, EventArgs e)
{
OleMenuCommand menuCommand = sender as OleMenuCommand;
if (menuCommand != null)
menuCommand.Visible = IsProjectOfRightType(GetSelected<Project>());
}
Das Problem ist - das status handler wird nie aufgerufen. Also habe ich diesen Menüpunkt für alle Projekttypen angezeigt.
Ich habe auch versucht IOleCommandTarget
Schnittstelle auf meinem Paket, wie zu implementieren: entweder
public int QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
// Disable all commands in case if project is VisuaART project, otherwise - disable them.
OLECMDF cmdf;
for (int i = 0; i < cCmds; i++)
{
var command = prgCmds[i];
if (command.cmdID == PkgCmdIDList.cmdidLoadUI)
{
if (IsProjectOfRightType(GetSelected<Project>()))
command.cmdf = (uint)COMMAND_SUPPORTED;
else
command.cmdf = (uint)COMMAND_UNSUPPORTED;
}
}
return VSConstants.S_OK;
}
private const OLECMDF COMMAND_SUPPORTED = OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED;
private const OLECMDF COMMAND_UNSUPPORTED = OLECMDF.OLECMDF_INVISIBLE;
Aber das macht nicht geholfen. Die Methode wird aufgerufen, aber die Einstellung OLECMDF.OLECMDF_INVISIBLE
tut nichts. Was muss ich tun, um diesen Menüeintrag für nicht unterstützte Menüelemente auszublenden?
Sehen Sie die UI-Kontext GUID Möglichkeiten hier: https://msdn.microsoft.com/en-us/library/bb166496.aspx Beachten Sie, dass wir die GUID oben auf dieser Seite sehen können, und es bedeutet UICONTEXT_SolutionExists. – CSA