7

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?

Antwort

7

Wahrscheinlich hängt das Problem mit der Last des Pakets zusammen. Um das Paket zu laden automatisch fügen Sie einfach dieses Attribut auf Ihr Paket Klasse:

[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")] 

Bsp .:

. 
. 
[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")] 
public sealed class MyPackageTest : Package 
{ 
. 
. 

Wenn Sie dieses Attribut nicht fügen Sie Ihre Klasse nur geladen wird, wenn Sie auf eine klicken Schaltfläche Ihres Pakets.

Ich hoffe, ich habe geholfen.

+1

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