1

VS2010 のソリューション エクスプローラーでファイルの状態をグリフとして表示する VSIX パッケージを作成しました。GetSccGlyph メソッドを含む基本的な SccProvider (IVsSccProvider、IVsSccManager2、IVsSccGlyphs などから継承) を実装しました。そのため、ソリューションが vsix パッケージを開くと、ソリューション全体の初期グリフが正常に読み込まれます。しかし、特定の (または全体の) ソリューション アイテムのグリフを更新する方法が見つかりません。適切な方法は次のようになります

var rgsiGlyphs = new VsStateIcon[1];
var rgdwSccStatus = new uint[1];
GetSccGlyph(1, new[] { itemFilePath }, rgsiGlyphs, rgdwSccStatus);
hierarchy.SetProperty(itemId, (int)__VSHPROPID.VSHPROPID_StateIconIndex, rgsiGlyphs[0]);

itemId - 特定のプロジェクト アイテム ID です。残念ながら、このアプローチはソリューションに対してのみ機能しますが、プロジェクト/クラス アイテム タイプのグリフは更新されません。すべてのプロジェクトの子アイテムのグリフを強制的に更新する別の方法があることを読みました

sccProject2.SccGlyphChanged(0, null, null, null);

しかし、うまくいきません。また、グリフのステータスを Scc にキャッシュすることができ、この更新を何らかの方法で強制する必要があることも読みましたが、正しい参照が見つかりませんでした。

VisualSvn やその他の同様のプラグインは何らかの形でグリフを動的に更新するため、それが可能であることはわかっています。誰かがこの問題を解決しましたか?

4

1 に答える 1

0

パッケージがある場合は、IVsHierarchyインターフェイスを実装することになっています。その場合、 AdviseHiarchyEventsメソッドを実装する必要があります。このメソッドでは、次のように、渡されたシンクを保持するコレクションに追加する必要があります。

    int IVsUIHierarchy.AdviseHierarchyEvents(IVsHierarchyEvents eventSink, out uint cookie)
    {
        cookie = _sinkCookie++; // come up with some unique cookie
        _eventSinks.Add(cookie, eventSink); // remember this sink
        return VSConstants.S_OK;
    }

    int IVsUIHierarchy.UnadviseHierarchyEvents(uint cookie)
    {
        _eventSinks.Remove(cookie);
        return VSConstants.S_OK;
    }

そして今、次のように、必要に応じてプロパティ変更イベントを発生させることができます。

    private void NotifySccChange()
    {
        foreach (sink in _eventSinks)
        {
            try
            {

                sink.OnPropertyChanged(MyId, (int)__VSHPROPID.VSHPROPID_StateIconIndex, 0);
            }
            catch (Exception e)
            {
                SinkIsDead(sink);
            }
        }
    }
于 2013-07-15T16:42:32.823 に答える