5

VS2008/2010 のアドインとして Visual Studio 拡張機能を開発しています。現在、新しいバージョンは VS2010 専用の VSIX パッケージとして作成される予定です (とにかく .NET 4 である必要があるため)。UI の処理に問題があります (かなり単純だと思います)。

拡張機能は主に、さまざまなアクションやフォームなどを起動するいくつかのボタンと、いくつかの状態情報を表示するためのラベルとしてのみ使用されるいくつかのボタンを備えたツールバーで構成されています。「ラベル」ボタン自体は非常に短く簡潔な情報を表示するだけですが、ツールチップはより詳細な情報を提供します。

アドイン全体が非常にエレガントだとは思いませんでしたが、このようなことを行うのは非常に簡単でした (私のアプローチは少し素人っぽかったかもしれませんが)。コマンドをツールバーに追加するとき、特定のローカル変数に「ラベル」ボタンを「保存」し、後でキャプションとツールチップ テキストを自由に設定できるようにします。

VSPackage では、 Microsoft.VisualStudio.CommandBars.CommandBarButtonに相当するものはOleMenuCommandのようです。MenuCommandServiceを介して "label" コマンドを見つけることは問題ありませんが、必要に応じて変更することは問題ありません。

これを行う方法を見つけるために、グループに 2 つのボタンがあるツールバーを用意しました。btnActionは非常に単純です。他のボタンのテキストを変更するためのアイコンと実行ハンドラだけで、CommandFlags はありません。 btnLabelは .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>

これに関する最初の問題は、TextChangesを使用すると、ToolTipText文字列が無視され、最初にButtonTextがツールチップにも使用されることです。

アクション ボタンのハンドラー コードは次のとおりです。

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";
}

これによりbtnLabelのキャプションが期待どおりに変更されますが、ツールチップを明示的に指定する方法がないため ( OleMenuCommandオブジェクトにはTextプロパティしかなく、 CaptionTooltipTextの両方を持つCommandBarButtonとは異なります)、ツールチップは常に同じ文字列に設定されます。キャプションとして。私が理解していることから、これは FindCommand() を使用すると、実際には UI ボタン​​を取得するのではなく、ツールチップを気にしない基本的なコマンドのみを取得するためです。

さらにややこしいのは、 TextChanges の代わりにTextChangesButton CommandFlagを使用するとどうなるかということです。ボタンは .vsct で定義されたツールヒント テキストを正しく表示するようになりましたが、他のボタンをクリックしてもキャプションもツールヒントも変更されません。ただし、btnLabelコマンドのTextプロパティを確認すると、期待どおりに設定されています (" x回クリックされました」)。TextChangesButtonは、コマンドとボタンのプロパティを「切り離す」ようなものですか? もしそうなら、これは私が望むものです(とにかく実行するものがないので、コマンドは気にしません; btnLabelは常に無効になります)、

さまざまな IV インターフェイスと SV サービスを調べましたが、適切なものを見つけることができませんでした。また、ドキュメント (および IntelliSense ヘルプ) はあまり広範ではないようです。

4

1 に答える 1

1

これに自分で答えるために-VSチームの誰かによると、新しい拡張構造は、コントロールのこれらのプロパティにそのような詳細にアクセスする方法を提供しません。私が達成したいことのためには、アドインで行ったのと同じように、DTE オブジェクトを取得し、ツールバーとコントロールを見つけて、それらを単に CommandBarButtons として処理するという昔ながらの方法を使用する必要があります。

于 2010-10-28T10:21:26.070 に答える