Дубликат первой записи на панели навигации в пользовательской языковой службе Visual Studio
Я реализую языковую службу Visual Studio для пользовательского языка сценариев, который используется внутри моей компании, и я столкнулся с проблемой с панелью навигации, реализованной как подкласс TypeAndMemberDropdownBars. Подкласс создается моим подклассом Language Service " LanguageService.CreateDropDownHelper".
В методе OnSynchronizeDropdowns я перебираю типы, определенные в файле, и добавляю DropDownMembers в передаваемый массив, чтобы заполнить панель навигации. Проблема, которую я вижу, заключается в том, что первый элемент в массиве дублируется и помещается в конец списка с помощью кода, к которому у меня нет доступа. Этот дополнительный элемент не работает правильно при выборе (ничего не происходит), но, похоже, не вызывает никаких других проблем; остальные элементы в списке работают нормально. Кроме того, похоже, что это происходит только с раскрывающимся списком типов - раскрывающийся список членов не отображает это поведение.
Я надеюсь, что кто-то еще видел и решил эту проблему и мог бы оказать некоторую помощь. Спасибо!
2 ответа
Лучшим решением является реализация обратного вызова LanguageService.OnParseComplete и оттуда вызова SynchronizeDropdowns. OnParseComplete всегда вызывается из основного потока, поэтому это предотвращает возникновение проблем с синхронизацией, а также избавляет вас от необходимости отслеживать необходимость вызова SynchronizeDropdowns() или нет.
Оказывается, это было вызвано тем, что я вызвал LanguageService.SynchronizeDropdowns из моего метода LanguageService.ParseSource, который вызывался в фоновом потоке. Я исправил эту проблему, установив флаг, когда ParseSource выполняет анализ Parse, а затем реализовав проверку для этого флага в моей функции LanguageService.OnIdle, которая будет вызывать SynchronizeDropdowns. Теперь он работает как положено!