Domanda

ho sviluppato un progetto di Visual Studio estensione come un add-in per VS2008 / 2010. La nuova versione è ora quello di essere fatto come un pacchetto VSIX per VS2010 solo (come deve essere .NET 4 in ogni caso), e sto avendo qualche problema con (, penserei piuttosto semplice) la gestione dell'interfaccia utente.

L'estensione è costituito principalmente da una barra degli strumenti con alcuni pulsanti che lanciano varie azioni, forme ecc, e alcuni che vengono utilizzati solo come etichette per visualizzare alcune informazioni di stato. I pulsanti "etichetta" si sono appena mostrano molto brevi e concise informazioni, mentre le descrizioni dei comandi forniscono ulteriori dettagli.

Anche se non pensavo che l'intero componente aggiuntivo cosa era molto elegante, a fare questo genere di cose è stato abbastanza semplice (anche se il mio approccio può essere stato un po 'amatoriale). Quando si aggiungono i comandi alla barra degli strumenti, vorrei "Salva" i pulsanti "etichetta" a variabili locali specifici, che mi permette di impostare in seguito il testo della didascalia e tooltip a volontà.

In un VSPackage, l'equivalente di Microsoft.VisualStudio.CommandBars.CommandBarButton sembra essere OleMenuCommand . Trovare il comando "etichetta" attraverso il MenuCommandService non è un problema, modificandolo in base alle esigenze è, tuttavia.

Ai fini di scoprire come fare questo, ho solo una barra degli strumenti con due pulsanti in un gruppo. btnAction è molto semplice; solo un'icona e un gestore eseguire per modificare il testo sul l'altro pulsante, non CommandFlags. btnLabel appare come questa nel .vsct:

<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
    <CommandFlag>DefaultDisabled</CommandFlag>
    <CommandFlag>DontCache</CommandFlag>
    <CommandFlag>NoCustomize</CommandFlag>
    <CommandFlag>TextChanges</CommandFlag>
    <CommandFlag>TextOnly</CommandFlag>
    <Strings>
        <CommandName>cmdidbtnLabel</CommandName>
        <ButtonText>btnLabel</ButtonText>
        <MenuText>btnLabel</MenuText>
        <ToolTipText>Tooltip btnLabel</ToolTipText>
    </Strings>
</Button>

Il primo problema è che quando uso TextChanges , il ToolTipText stringa viene ignorato e il ButtonText è inizialmente usata per il tooltip pure.

Il codice gestore per il pulsante di azione è la seguente:

private int iClickCount = 0;

protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
    var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

    CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
    var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;

    cmd.Text = "Clicked " + (++iClickCount) + " times";
}

Questa modifica la didascalia di btnLabel come previsto, ma in quanto non v'è alcun modo di specificare in modo esplicito il tooltip ( OleMenuCommand oggetto solo ha un testo proprietà, a differenza CommandBarButton , che ha sia didascalia e TOOLTIPTEXT ), il suggerimento è sempre impostato per la stessa stringa come la didascalia. Da quello che ho capito, questo è perché con findCommand () Io non sono in realtà sempre il pulsante di interfaccia utente, ma solo il comando sottostante, che non si preoccupa le descrizioni dei comandi.

La cosa ancora più confuso è ciò che accade quando uso il TextChangesButton CommandFlag invece di TextChanges . Il pulsante viene visualizzato correttamente il testo tooltip definito nella .vsct, ma né la didascalia né il tooltip cambierà quando scatto l'altro pulsante - anche se quando controllo il btnLabel del comando testo proprietà, è impostato su quello che mi aspetto ( "Clicked volte x"). Fa TextChangesButton tipo di "DECOUPLE" le proprietà del comando e il pulsante? Se è così, questo è più o meno quello che voglio (non mi interessa sul comando, in quanto non v'è nulla di eseguire in ogni caso; btnLabel sarà sempre disattivato), ma come posso accedere al pulsante e le sue proprietà particolare stringa?

ho guardato attraverso gli IV interfacce e servizi vari SVS, ma non riusciva a trovare qualcosa di appropriato, e la documentazione (e IntelliSense aiuto) non sembra essere molto ampia.

È stato utile?

Soluzione

Per rispondere a questo io stesso - secondo qualcuno dalla squadra VS, la nuova struttura estensibilità non offre modi per accedere a queste proprietà dei controlli in modo così dettagliato. Per quello che voglio per raggiungerlo sarà necessario andare alla vecchia maniera di entrare in possesso dell'oggetto DTE, trovando la mia barra degli strumenti e le mie controlli e semplicemente gestire come CommandBarButtons, proprio come ho fatto nel mio componente aggiuntivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top