我创建了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和其他类似的插件会以某种方式动态更新字形。有人解决了这个问题吗?
答案 0 :(得分:0)
如果你有一个包,你应该实现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);
}
}
}