我有VS编辑器扩展程序,当用户执行某项操作时,我想将它们发送到代码中的特定位置 - 与Go To Definition不同,或者当您执行时会发生什么单击调试器中的堆栈帧。
到目前为止,我使用dte.ItemOperations.OpenFile打开实际文件,并且我有相关的ITextDocument,但我不知道如何将视图设置到文件中的相关位置。看起来ITextView和IVsTextView以及朋友们都有我需要的方法,但我不确定如何从我的ITextDocument获取我需要的实例。
如何从VS扩展程序转到我想要的文件和位置?
答案 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
个实例。最常见的情况是窗口中存在水平分割。对于这种情况可能并不重要但是想确保它被召唤出来