Visual Studio 中的匹配大括号扩展示例如何工作?
How does the Matching Braces extension example in Visual Studio work?
我正在查看 Visual Studio 上的“Displaying Matching Braces”扩展示例,需要一些帮助来理解代码。
创建初始 "BraceMatchingTagger" 后,对于每次插入符号移动,都会调用 "UpdateAtCaretPosition" 函数。此函数引发 TagsChanged 事件。我一直跟着到这里。然而,
1) 谁在处理这个事件?
2) 谁调用了 GetTags?
我的理解是,当移动插入符号时,会引发 "TagsChanged" 事件。编辑器以某种方式处理了这个问题。稍后,编辑器调用扩展的 "GetTags"。这是正确的吗?我也不完全清楚这些函数的调用顺序。
有人可以帮忙吗?
您的理解是正确的。 TagsChanged 由 Visual Studio 处理,它在 UpdateAtCaretPosition returns 之后调用 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()
我正在查看 Visual Studio 上的“Displaying Matching Braces”扩展示例,需要一些帮助来理解代码。
创建初始 "BraceMatchingTagger" 后,对于每次插入符号移动,都会调用 "UpdateAtCaretPosition" 函数。此函数引发 TagsChanged 事件。我一直跟着到这里。然而,
1) 谁在处理这个事件?
2) 谁调用了 GetTags?
我的理解是,当移动插入符号时,会引发 "TagsChanged" 事件。编辑器以某种方式处理了这个问题。稍后,编辑器调用扩展的 "GetTags"。这是正确的吗?我也不完全清楚这些函数的调用顺序。
有人可以帮忙吗?
您的理解是正确的。 TagsChanged 由 Visual Studio 处理,它在 UpdateAtCaretPosition returns 之后调用 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()