簡體   English   中英

如何在解決方案資源管理器中以編程方式更新/刷新字形?

[英]How to update / refresh glyphs programmatically in Solution Explorer?

我已經創建了VSIX程序包,該程序包在VS2010中的解決方案資源管理器中將文件狀態顯示為字形。 我實現了基本的SccProvider(繼承自IVsSccProvider,IVsSccManager2,IVsSccGlyphs等),包括GetSccGlyph方法。 因此,當解決方案打開時,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和其他類似的插件會以某種方式動態更新字形。 有誰解決了這個問題?

如果您有一個包,則應該實現IVsHierarchy接口。 這樣做時,必須實現AdviseHiearchyEvents方法。 在此方法中,必須將傳入的接收器添加到保留的集合中,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM