Я пишу расширение 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 завершается ошибкой.