2014-07-17 26 views
7

Angenommen, wir haben ein VSPackage mit einer Symbolleiste und ein paar Befehlen in der Symbolleiste. Wie können Sie einen der Befehle auf der Symbolleiste programmatisch ein-/ausblenden? Wenn Sie ein Benutzer sind, können Sie das tun, indem Sie die Symbolleiste anpassen. Daher habe ich das starke Gefühl, dass es auch aus dem Code einen Weg geben muss, dies zu tun.Dynamische Anzeige benutzerdefinierter Visual Studio VSPackage-Befehl in der Symbolleiste

Da wir kein AddIn entwickeln, können wir DTE.Commands.AddNamedCommand(AddInInstance, Name, ButtonText, ToolTip, MSOButton) nicht verwenden.

Das ist alles in Ordnung, weil wir immer noch unsere Befehle mit der Visual Studio-Befehlstabelle (.vsct) Format definieren können, und das ist der vorgeschlagene Weg für VSPackages:

<?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="vsshlids.h" /> 

    <Commands package="testPackage"> 

    <Menus> <!-- Define the menus, toolbars, etc. --> 
     <Menu guid="commands" id="toolbar" type="Toolbar"> 
     <Parent guid="guidSHLMainMenu" id="IDG_VS_BUILD_SOLUTION" /> 
     <CommandFlag>DefaultDocked</CommandFlag> 
     <Strings> 
      <ButtonText>TestToolbar</ButtonText> 
     </Strings> 
     </Menu> 
    </Menus> 

    <Groups> <!-- Define the groups for commands --> 
     <Group guid="commands" id="toolbarGroup" priority="0x0001"> 
     <Parent guid="commands" id="toolbar" /> 
     </Group> 
    </Groups> 

    <Buttons> <!-- Define the commands as buttons --> 
     <Button guid="commands" id="button0" type="Button"> 
     <Parent guid="commands" id="toolbarGroup" /> 
     <CommandFlag>DynamicVisibility</CommandFlag> 
     <Strings> 
      <ButtonText>TestButton0</ButtonText> 
     </Strings> 
     </Button> 
     <Button guid="commands" id="button1" type="Button"> 
     <Parent guid="commands" id="toolbarGroup" /> 
     <CommandFlag>DynamicVisibility</CommandFlag> 
     <Strings> 
      <ButtonText>TestButton1</ButtonText> 
     </Strings> 
     </Button> 
    </Buttons> 

    </Commands> 

    <Symbols> 
    <GuidSymbol name="testPackage" value="{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}" /> 

    <GuidSymbol name="commands" value="{EEEEEEEE-EEEE-EEEE-EEEE-EEEEEEEEEEEE}"> 
     <IDSymbol name="toolbar" value="0x0100" /> 
     <IDSymbol name="toolbarGroup" value="0x0010" /> 
     <IDSymbol name="button0" value="0x0000" /> 
     <IDSymbol name="button1" value="0x0001" /> 
    </GuidSymbol> 
    </Symbols> 

</CommandTable> 

Später auf dem C# -Code Sie verschiedene Eigenschaften eines MenuCommand einstellen können wir oben gerade definiert haben:

System.ComponentModel.Design.MenuCommand menuCommand = <Acquire your menu command>; 
menuCommand.Enabled = <enabled>; 
menuCommand.Visible = <visible>; 
menuCommand.Supported = <supported>; 

das Problem ist, dass, wenn der Menübefehl auf einer Symbolleiste platziert wird, dann würde die Visible-Eigenschaft falsch machen die Taste nicht verbergen, j macht es grau. (Es ist in allen anderen Menüs in Ordnung.) Dies ist eine Funktion von Visual Studio, kein Fehler.

Aber was ich brauche, ist genau das: Verstecken Button0. (Nehmen wir an Button0 wird nur angezeigt, wenn eine spezielle Bedingung zutrifft, zB: Sie haben weniger Platz auf Ihrer Festplatte als X MB oder wenn Sie ein anderes Werkzeug installiert haben oder einfach Ihre eigene Bedingung erstellen.)

Man könnte die folgende Technik aus der AddIn mal mit der Taste löschen, wenn sie nicht benötigt:

EnvDTE.Command button0 = DTE.Commands.Item(commandsGuid, button0CommandId); // Both are the same as in the .vsct file 
if (button0 != null) 
    button0.Delete(); 

Command0 gefunden wird, aber wenn zu löschen versucht, ich habe eine Ausnahme bekommt: Unbekannten Fehler (Ausnahme von HRESULT: 0x80004005 (E_FAIL)) Schließlich macht es irgendwie Sinn, da es wurde über den .vsct-Mechanismus erstellt, nicht programmgesteuert.

Ich habe keine Ideen mehr. Bitte helfen Sie mir herauszufinden, wie man Symbolleistenschaltflächen zur Laufzeit programmatisch ausblenden/anzeigen oder hinzufügen/entfernen kann. Gibt es eine andere Möglichkeit, die VSPackage-Befehle als die .vsct-Datei zu definieren?

Jede Hilfe wird geschätzt.

+0

Ich habe das gleiche Problem. Ich habe auch versucht, Abschnitt der vsct-Datei zu verwenden, aber ohne Erfolg. Hast du damit Fortschritte gemacht? – Przemaas

+0

@ Przemaas wir mit dem deaktivierten Symbol (ausgegraut) festgefahren.Niemals herausgefunden, wie man es verschwinden lässt, da es Aufgaben mit höherer Priorität gegeben hat. – Shakaron

+0

https://stackoverflow.com/questions/14572226/hiding-a-button-from-a-plugin-toolbar/ –

Antwort

7

allererst Sie DynamicVisibility Flagge auf Ihre Schaltfläche in VSCT Datei definieren:

<Button guid="commands" id="button0" priority="0x1001" type="Button"> 
    <Parent guid="commands" id="toolbarGroup" /> 
    <CommandFlag>DefaultInvisible</CommandFlag> 
    <CommandFlag>DynamicVisibility</CommandFlag> 
    <Strings> 
     <ButtonText>TestButton1</ButtonText> 
    </Strings> 
    </Button> 

Als nächstes wird in überschriebenen Package.Initialize erstellen Befehl Handler OleMenuCommand Klasse statt MenuCommand und abonnieren wie diese BeforeQueryStatus Veranstaltung :

OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
if (null != mcs) 
{ 
    // Create the command for the menu item. 
    CommandID menuCommandID = new CommandID(GuidList.guidToolbarCmdSet, (int)PkgCmdIDList.cmdidButton0); 
    var menuItem = new OleMenuCommand(MenuItemCallback, menuCommandID); 
    menuItem.BeforeQueryStatus += BeforeQueryStatusCallback; 
    mcs.AddCommand(menuItem); 
} 

in BeforeQueryStatusCallback Jetzt können Sie Sie Knopf

private void BeforeQueryStatusCallback(object sender, EventArgs e) 
{ 
    var cmd = (OleMenuCommand)sender 
    cmd.Visible = true; 
} 
ein- oder ausblenden
+0

Dies ist vollkommen richtig, wenn die Schaltfläche ** nicht auf einer Symbolleiste ** befindet. Aber in meinem Fall ist es, deshalb ist es nicht versteckt, sondern ausgegraut, wie ich in meinem ursprünglichen Beitrag darauf hingewiesen habe. Du hast Recht, ich hätte die DynamicVisiblility-Flagge auf den Gegenständen enthalten sollen. Ich habe es behoben. – Shakaron

+0

Typo - fehlendes Semikolon am Ende der Zeile: var cmd = (OleMenuCommand) sender –