Как работает пример расширения Matching Braces в Visual Studio?
Я рассматриваю пример расширения " Отображение совпадающих фигурных скобок" в Visual Studio и мне нужна помощь в понимании кода.
После создания исходного "BraceMatchingTagger" для каждого перемещения каретки вызывается функция "UpdateAtCaretPosition". Эта функция вызывает событие TagsChanged. Я следую до здесь. Тем не мение,
1) Кто занимается этим событием?
2) Кто вызывает GetTags?
Насколько я понимаю, когда каретка перемещается, возникает событие "TagsChanged". Редактор как-то справляется с этим. Позже, GetTags расширения вызывается редактором. Это правильно? Мне также не совсем ясно, в каком порядке эти функции вызываются.
Может кто-нибудь помочь с этим?
1 ответ
Ваше понимание верно. TagsChanged обрабатывается Visual Studio и вызывает GetTags после возврата UpdateAtCaretPosition. Последовательность вызовов такая (создается с использованием потока выполнения):
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()