转到VS扩展中的代码位置

时间:2014-03-20 15:11:41

标签: visual-studio-2013

我有VS编辑器扩展程序,当用户执行某项操作时,我想将它们发送到代码中的特定位置 - 与Go To Definition不同,或者当您执行时会发生什么单击调试器中的堆栈帧。

到目前为止,我使用dte.ItemOperations.OpenFile打开实际文件,并且我有相关的ITextDocument,但我不知道如何将视图设置到文件中的相关位置。看起来ITextView和IVsTextView以及朋友们都有我需要的方法,但我不确定如何从我的ITextDocument获取我需要的实例。

如何从VS扩展程序转到我想要的文件和位置?

1 个答案:

答案 0 :(得分:1)

最简单的方法是返回ItemOperations.OpenFile并从中导航到IWpfTextView

IWpfTextView GetWpfTextViewForDteWindow(
    Window window,
    System.IServiceProvider serviceProvider,
    IVsEditorAdaptersFactoryService vsEditorAdaptersFactoryService)
{
    var path = Path.Combine(window.Document.Path, window.Document.Name);

    IVsUIHierarchy vsuiHierarchy;
    uint itemID;
    IVsWindowFrame vsWindowFrame;
    if (VsShellUtilities.IsDocumentOpen(
        serviceProvider,
        path,
        Guid.Empty,
        out vsuiHierarchy,
        out itemID,
        out vsWindowFrame))
    {
        // Note this may have multiple IVsTextView instances associated with it in a split window but 
        // this will retrieve at least one 
        var vsTextView = VsShellUtilities.GetTextView(vsWindowFrame);
        var wpfTextView = vsEditorAdaptersFactoryService.GetWpfTextView(vsTextView);

        return wpfTextView;
    }

    return null;
}

请注意,DTE Window对象和ITextView实例之间不一定存在1-1映射。 Window对象实际上表示可视化显示为选项卡的内容,给定选项卡可包含许多ITextView个实例。最常见的情况是窗口中存在水平分割。对于这种情况可能并不重要但是想确保它被召唤出来