Как программно интегрировать пользовательскую навигацию в список Visual Studio «Навигация назад»C#

Место общения программистов C#
Anonymous
Как программно интегрировать пользовательскую навигацию в список Visual Studio «Навигация назад»

Сообщение Anonymous »

Я разрабатываю расширение Visual Studio с собственной картой кода. Это элемент управления в виде дерева, узлы которого представляют определенные элементы кода. Щелкнув узел дерева, вы переходите к объявлению соответствующего элемента кода в редакторе кода.
Упрощенная версия навигации выглядит так:

Код: Выделить всё

    public static async Task NavigateAsync(
Microsoft.VisualStudio.Shell.IAsyncServiceProvider serviceProvider,
string filePath,int lineNumber, int character)
{
// first I obtain IWpfTextView for the active document
IWpfTextView wpfTextView = await OpenCodeWindowAsync(serviceProvider, filePath);

// next, generate the position to navigate to
ITextSnapshotLine textLine = wpfTextView.TextSnapshot.GetLineFromLineNumber(lineNumber);
int absoluteOffset = textLine.Start + character;

// expand all collapsed regions in case we navigate inside them
// with a call to the helper method
SnapshotPoint point = wpfTextView.TextSnapshot.GetPoint(absoluteOffset);
SnapshotSpan span   = new SnapshotSpan(point, length: 0);
await serviceProvider.ExpandAllRegionsContainingSpanAsync(span, wpfTextView);

// move the caret to a new position and scroll the code editor to it
CaretPosition newCaretPosition = wpfTextView.MoveCaretTo(absoluteOffset);
wpfTextView.ViewScroller.EnsureSpanVisible(span, EnsureSpanVisibleOptions.AlwaysCenter);
}
Все работает нормально, за исключением того, что список посещенных мест в Visual Studio не обновляется.
Я имею в виду журнал «Навигация назад», расположенный в верхнем левом углу Visual Studio:
Изображение

Я нашел это описание этой функции в MSDN:
https://learn.microsoft.com/en-us/archi ... -navigate- вперед
В нем упоминается, что VS создает так называемые «маркеры возврата», которые по сути представляют собой записи в журнале навигации. В некоторых других местах их также можно назвать «путевыми точками». Они создаются при следующих условиях:

Маркер возврата удаляется при следующих условиях:
  • Последовательный поиск (в том числе обратный) оставляет маркер возврата
    в начале поиска и еще один в конце.

    Действие «Перейти к строке», например CTRL + G, или щелчок мыши, который перемещает курсор на 11 строк или более от текущего положения, оставляет маркер возврата
    в новое местоположение.
  • Деструктивное действие (например, нажатие клавиши Backspace) после перемещения курсора в новое место оставляет маркер возврата.
  • При выполнении поиска, например Ctrl+F, в найденном месте сбрасывается маркер возврата.
  • При открытии файла маркер возврата удаляется в том месте, где находился курсор на старом файле, а другой — на открытом файле.
Я считаю, что это то, что мне нужно. Я хочу программно добавить такие маркеры возврата, но не могу найти способ сделать это. Я искал их в Google, MSDN, примерах расширения VS от Мэдса Кристенсена, проектах с открытым исходным кодом на GitHub, но пока мне не удалось найти ни одного API, который позволил бы их использовать. Что я уже нашел:
  • Реализации очень близки к тем, которые я использую в других проектах, в которых есть специальные карты кода для VS
  • Реализации с использованием старых COM-интерфейсов VS, например:

    Код: Выделить всё

    EnvDTE.TextSelection ts = dte.ActiveDocument.Selection as EnvDTE.TextSelection;
    ts.MoveToLineAndOffset(…);
    
    Навигация работает, но журнал навигации по-прежнему не обновляется.
  • Реализации навигации, которые внутренне вызовите команду "Перейти к определению" следующим образом. Я не могу повторно использовать команду Перейти к определению, потому что:

    Карта кода не содержит текста под курсором, который используется командой "Перейти к определению" как своего рода ввод.
  • В общем, мне нужна пользовательская навигация, а не просто переход к определению. . Мое расширение имеет другие функции, требующие специальных правил навигации.

В настоящее время я Я застрял с этой проблемой и был бы очень признателен за любую помощь.
ОБНОВЛЕНИЕ: Я также пытался проверить слои VS с открытым исходным кодом, которые хранятся на GitHub:
https://github.com/microsoft/vs-editor-api/tree/main
К сожалению, я не нашел ничего, что можно было бы использовать, или реализации функции «Навигация назад». Возможно, я просто пропустил это.
В Roslyn есть внутренние службы IDocumentNavigationService и IGoToDefinitionService, сейчас я пытаюсь посмотреть, смогу ли я использовать их либо с отражением, либо с использованием аналогичной логики.Если этот подход сработает, я добавлю ответ с его описанием.
Тем не менее, я всегда предпочитаю общедоступный API использованию внутренних сервисов, поэтому мой вопрос по-прежнему остается открытым. соответствующий. Я бы отметил ответ, который использует общедоступный API и решил мою проблему, как правильный по сравнению с любым ответом, основанным на вызовах внутренних служб.

Подробнее здесь: https://stackoverflow.com/questions/770 ... dio-naviga

Вернуться в «C#»