【问题标题】:How to update / refresh glyphs programmatically in Solution Explorer?如何在解决方案资源管理器中以编程方式更新/刷新字形?
【发布时间】:2012-06-26 20:01:30
【问题描述】:

我创建了 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 和其他类似的插件会以某种方式动态更新字形。有没有人解决过这个问题?

【问题讨论】:

    标签: c# visual-studio vsix vs-extensibility solution-explorer


    【解决方案1】:

    如果你有一个包,你应该实现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);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 2013-01-26
      • 2015-04-22
      • 2011-02-04
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多