将自定义编辑器窗口添加到Visual Studio窗口窗格

Jos*_*rty 22 c# mef editor visual-studio visual-studio-extensions

我的问题

我正在尝试构建一个Visual Studio扩展,它允许在每个函数的基础上编译代码,而不是基于每个文件.我基本上试图以类似于Microsoft Debugger Canvas的方式显示代码.

我想知道如何在一个窗口中托管多个Visual Studio编辑器(我相信windows正在实现IVsWindowFrame).我所追求的功能如下所示:

Microsoft Debugger Canvas

每个编辑器窗口都保留了典型功能,并按预期与第三方扩展进行交互.(例如,VsVim在这些窗口中正常运行).

我试过的

我花了将近两周的时间来研究和尝试这些东西,并且我在确定我将使用哪些服务,接口和类时遇到了很多麻烦.

通过MSDN阅读

首先,大多数文档讨论了如何编辑单个编辑器窗口以及添加装饰,标签,边距等.它没有讨论在窗口窗格中生成多个编辑器的可能性.

我已经通过文件枕着一个广大感兴趣的我,包括接口IVsTextBuffer,IVsTextViewIVsInvisibleEditor.不幸的是,我不能让这些接口中的一些很好地一起玩.

最重要的是,通常优秀的MSDN在这方面非常缺乏.许多接口只包含一个成员列表,甚至没有关于预期用途和功能的基本注释.(例如,IComponentModel).

许多接口都引用了一组编辑器示例,但无法在MSDN上读取或下载代码.显然它随Visual Studio 2005一起提供,但我没有这个版本的Visual Studio,也找不到它.

与IVsUIShell交互

我可以访问所有打开的WindowFrame,IVsUIShell.GetDocumentWindowEnum(); 我看到有一个IVsUiShell.CreateDocumentWindow()方法,但我完全不熟悉它接受的参数,或者这是否是正确的路径.

我需要做什么

  1. 以编程方式创建可停靠的窗格
  2. 以编程方式将编辑器添加到此窗口窗格.(并确保它们在Visual Studio,正在运行的文档表等中正确注册)

编辑:

对不起,我应该扩展我的步骤.当我说我需要注册正在运行的文档表和Visual Studio时,这是因为我想在我的自定义编辑器中实际编辑原始文档.下面是我正在尝试重新创建的Debugger Canvas中可用功能的简短示例:

http://i.imgur.com/aYm8A5E.gif(我无法嵌入.gif文件)

或者:

如果有人知道我在哪里可以找到Visual Studio 2005附带的编辑器示例,例如基本编辑器示例,我相信我可以想出这些东西.MSDN文档没有关于这些接口的代码示例,这使我的工作非常困难.

Sam*_*ell 12

GIT中源代码控制是一个开源扩展包括嵌入了标准编辑器作为自定义WPF工具窗口内的控制的工具窗格.我会使用此代码作为任何Visual Studio 2010+扩展的参考,我想在某个自定义位置托管编辑器窗口.

  • PendingChangesView.xaml包括一个ContentControl名为DiffEditor,其内容将是编辑器.
  • PendingChangesView.xaml.cs包括一个方法ShowFile,该方法调用方法来创建编辑器控件并将结果指定为内容DiffEditor.
  • ToolWindowWithEditor.cs包括一个SetDisplayedFile返回Tuple<Control, IVsTextView>接口的方法,该接口提供对Control可以添加到文本视图ContentControl以及IVsTextView文本视图的访问.这种方法很重要.

请注意,该SetDisplayedFile方法包括以下几种形式的行:

textViewHost.TextView.Options.SetOptionValue({name}, {value});
Run Code Online (Sandbox Code Playgroud)

这些行为Git源控制提供程序执行关键功能,例如删除边距并使窗口只读.有许多选项,因此您需要查看文档DefaultTextViewOptionsDefaultTextViewHostOptions应用适合您特定扩展名的文档.


Mat*_*tze 1

您需要使用您的包扩展注册一个工具窗口;这可以通过属性来完成ProvideToolWindow。以下文章包含有关如何在工具窗口中托管编辑器的所有必需信息: http: //bit.ly/9VWxPR

\n\n

看看班级WpfTextViewHost;该文章解释说,这种类型实际上是一个UIElement,所以我想它\xc2\xb4s 可以托管它的多个实例......

\n