Первый вызов TextSelection.GotoLine завершается неудачно - PullRequest
1 голос
/ 20 мая 2019

Я пишу расширение VS. После выбора какого-либо «результата» на панели «списка результатов» я открываю (или устанавливаю фокус) связанный файл в редакторе исходного кода, прокручиваю до соответствующей строки и выбираю ее.

Странно, но первый звонок всегда терпит неудачу: прокрутка плохая. Вместо того, чтобы иметь выделенную строку в середине видимой текстовой области, как обычно, выделенная строка находится на линии перед первой видимой (следовательно, не видимой).

Все остальные последующие вызовы работают как положено ...

В случае плохого начального состояния, я пытался передвигать курсор раньше (используя PageUp, PageDown, EndOfDocument ...), но ничего не получалось.

private void SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    PS_ResultsList resultsList = (DataContext as PS_ResultsList);
    PS_Result selectedItem = resultsList.SelectedItem;

    // ...

    // Open related file when applicable
    string replacedFile = "some/path/hacking/for/debug";
    string filePath = selectedItem.filePath;

    // ...

    if (File.Exists(replacedFile))
    {
        DTE2 dte2 = PS_Package.Instance.GetService2(typeof(DTE)) as DTE2;
        var itemsOperations = dte2.ItemOperations;
        itemsOperations.OpenFile(replacedFile, Constants.vsViewKindCode);

        var textSelection = dte2.ActiveDocument.Selection as TextSelection;
        var line = selectedItem.function.lineNum;
        var col = selectedItem.function.colNum;

        textSelection.GotoLine(line, true);
    }
}

Я ожидаю, что первый звонок сработает, как и все остальные ... Есть идеи? Любая помощь будет принята с благодарностью. Спасибо!

Редактировать: добавить больше деталей

Список результатов:

    class PS_ResultsList : ObservableCollection<PS_Finding>
    {
        public PS_Finding SelectedItem { get; set; }
    }

Объявление в XAML:

<UserControl ...
             d:DesignHeight="300" d:DesignWidth="300"
             Name="PS_ResultsList_TWC">
    <DataGrid
            SelectionMode="Single"
            ItemsSource="{Binding}" 
            AutoGenerateColumns="False"
            SelectedItem="{Binding SelectedItem}"
            SelectionChanged="SelectionChanged"
            IsSynchronizedWithCurrentItem="True">
        ...

Заполнение списка результатов: список результатов размещается на панели инструментов

    class PS_ResultsList_TW : ToolWindowPane
    {
        // ...

        public void SetResultsList(PS_ResultsList resultsList)
        {
            PS_ResultsList_TWControl resultsList_TWControl =
                Content as PS_ResultsList_TWControl;
            resultsList_TWControl.DataContext = resultsList;
        }
    }

Редактировать: уменьшенный пример

Я создал пример проекта VSIX с пользовательской командой. Я подключил к команде следующее:

        private void MenuItemCallback(object sender, EventArgs e)
        {
            string filePath = @"C:\some\path\to\some\file.cpp";

            MessageBox.Show("Opening file: " + filePath);

            if (File.Exists(filePath))
            {
                DTE2 dte2 = ServiceProvider.GetService(typeof(DTE)) as DTE2;
                var itemsOperations = dte2.ItemOperations;
                itemsOperations.OpenFile(filePath, Constants.vsViewKindCode);

                var textSelection = dte2.ActiveDocument.Selection as TextSelection;
                textSelection.GotoLine(51, true);
            }
        }

Не имеет значения, является ли файл локальным или находится в сети. Что касается номера строки, я просто проверяю, чтобы в моем файле примера было достаточно строк, чтобы запрошенная строка отображалась в середине экрана.

Шаги воспроизведения:

  • Запустить VS: файл не открыт
  • Выберите меню Инструменты> Моя команда: файл открывается, и строка перехода не выполняется (строка скрыта)
  • Закройте файл и откройте любой другой
  • Выберите меню Инструменты> Моя команда: файл открывается и строка перехода завершается успешно (строка видна в середине экрана)
  • Закрыть все файлы
  • Выберите меню Сервис> Моя команда: файл открывается, и строка перехода не выполняется (строка скрыта)

Вывод: ошибка при открытии файла first завершается ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...