我正在浏览Visual Studio上的“Displaying Matching Braces”扩展示例,需要一些帮助来理解代码。
在创建初始“BraceMatchingTagger”之后,对于每个插入符号移动,将调用“UpdateAtCaretPosition”函数。此函数正在引发TagsChanged事件。我跟着到这里。但是,
1)谁在处理此事件?
2)谁打电话给GetTags?
我的理解是,当移动插入符号时,会引发“TagsChanged”事件。编辑器以某种方式处理这个。稍后,编辑器会调用扩展程序的“GetTags”。这是正确的吗?我也不完全清楚调用这些函数的顺序。
有人可以帮忙吗?
答案 0 :(得分:0)
您的理解是正确的。 TagsChanged由Visual Studio处理,并在UpdateAtCaretPosition返回后调用GetTags。调用序列是这个(使用Runtime Flow创建):
void BraceMatchingTagger.CaretPositionChanged(CaretElement{_blinkInterval=530, _newOpacity=1., _preferredXCoordinate=2., _preferredYOffset=88., _displayedHeight=15., _displayedWidth=1., _updateNeeded=false, _isClosed=false, _emptySelection=true, _isHidden=false, _forceVirtualSpace=false, _caretGeometryNeedsToBeUpdated=true, _isContainedByView=true, _overwriteMode=false}, CaretPositionChangedEventArgs)
void BraceMatchingTagger.UpdateAtCaretPosition(CaretPosition)
. BraceMatchingTagger.GetTags(NormalizedSnapshotSpanCollection)
. <GetTags>d__20.System.Collections.Generic.IEnumerable<Microsoft.VisualStudio.Text.Tagging.ITagSpan<Microsoft.VisualStudio.Text.Tagging.TextMarkerTag>>.GetEnumerator()
true <GetTags>d__20.MoveNext()
true BraceMatchingTagger.FindMatchingCloseChar(SnapshotPoint{position=27}, {, }, 7, .)
. <GetTags>d__20.System.Collections.Generic.IEnumerator<Microsoft.VisualStudio.Text.Tagging.ITagSpan<Microsoft.VisualStudio.Text.Tagging.TextMarkerTag>>.get_Current()
true...false <GetTags>d__20.MoveNext()
void <GetTags>d__20.System.IDisposable.Dispose()