C# 如何在解决方案资源管理器中以编程方式更新/刷新图示符?

C# 如何在解决方案资源管理器中以编程方式更新/刷新图示符?,c#,visual-studio,vsix,vs-extensibility,solution-explorer,C#,Visual Studio,Vsix,Vs Extensibility,Solution Explorer,我已经创建了VSIX包,它在VS2010的解决方案资源管理器中将文件状态显示为图示符。我实现了基本的SccProvider(继承自IVsSccProvider、IVsSccManager2、IVsSccGlyphs和其他),包括GetSccGlyph方法。因此,当解决方案打开vsix包时,成功加载整个解决方案的初始标志符号。但我找不到一种方法来更新特定(或整个)解决方案项的标志符号。合适的方法应该是 var rgsiGlyphs = new VsStateIcon[1]; var rgdwScc

我已经创建了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。不幸的是,这种方法仅适用于解决方案,但不更新项目/类项类型的图示符。我了解到还有另一种方法可以强制刷新所有项目子项的glyphs

sccProject2.SccGlyphChanged(0, null, null, null);
但它不起作用。我还读到字形状态可以缓存在Scc中,并且应该以某种方式强制刷新,但我再次没有找到任何正确的引用


我知道这是可能的,因为VisualSvn和其他类似插件以某种方式动态更新glyphs。有人解决了这个问题吗

如果你有一个包,你应该实现这个接口。执行此操作时,必须实现该方法。在此方法中,必须将传入的接收器添加到保留的集合中,如下所示:

    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);
            }
        }
    }
现在,您可以在需要时引发属性更改事件,如下所示:

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