第一次调用TextSelection.GotoLine失败

时间:2019-05-20 12:53:46

标签: c# visual-studio-extensions

我正在编写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;
        }
    }

0 个答案:

没有答案