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