c# - 将自定义编辑器窗口添加到 Visual Studio 窗口 Pane

标签 c# visual-studio editor mef visual-studio-extensions

我的问题

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

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

Microsoft Debugger Canvas

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

我尝试过的

我花了将近两周的时间研究和尝试这些东西,但在确定要使用哪些服务、接口(interface)和类时遇到了很多麻烦。

阅读MSDN

首先,大部分 documentation讨论了如何编辑单个编辑器窗口并添加装饰、标签、边距等。它没有讨论在一个窗口 Pane 中生成多个编辑器的可能性。

我浏览了有关我感兴趣的大量接口(interface)的文档,包括 IVsTextBufferIVsTextViewIVsInvisibleEditor。不幸的是,我无法让其中一些界面很好地协同工作。

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

许多接口(interface)都引用了一组 Editor Samples但无法在 MSDN 上读取或下载代码。显然它随 Visual Studio 2005 一起提供,但我没有这个版本的 Visual Studio,也找不到它。

与 IVsUIShell 交互

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

我需要做什么

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

编辑:

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

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

或者:

如果有人知道我在哪里可以找到 Visual Studio 2005 附带的编辑器示例,例如 Basic Editor Sample我确定我能弄清楚这些东西。 MSDN 文档中没有关于这些接口(interface)的代码示例,这让我的工作变得异常困难。

最佳答案

Git Source Control Provider是一个开源扩展,包括一个工具 Pane ,将标准编辑器作为自定义 WPF 工具窗口中的控件嵌入。我会使用此代码作为任何 Visual Studio 2010+ 扩展的引用,我想在某些自定义位置托管编辑器窗口。

  • PendingChangesView.xaml 包括 ContentControl名为 DiffEditor , 其内容将是编辑器。
  • PendingChangesView.xaml.cs 包括一个方法 ShowFile , 它调用一个方法来创建编辑器控件并将结果分配为 ​​DiffEditor 的内容.
  • ToolWindowWithEditor.cs 包括一个方法 SetDisplayedFile返回 Tuple<Control, IVsTextView>接口(interface),提供对 Control 的访问可以添加到 ContentControl以及 IVsTextView对于 TextView 。 繁重的工作在这个方法中。

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

textViewHost.TextView.Options.SetOptionValue({name}, {value});

这些行执行 Git 源代码管理提供程序的关键功能,例如删除边距和使窗口只读。有许多选项可用,因此您需要查看 DefaultTextViewOptions 的文档和 DefaultTextViewHostOptions 应用适合您的特定扩展的那些。

关于c# - 将自定义编辑器窗口添加到 Visual Studio 窗口 Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17778268/

相关文章:

c# - 来自多个线程的安慰 session SendRequest() 正在阻塞

java - 什么是需要 UTF-16 代理项对的好的 Unicode 代码点?

javascript - 如何在draft-js中使用replaceWithFragment?

delphi - TTreeView : How to change the text of item's inplace editor?

macos - Cocoa 中有用于代码编辑的 API 吗?

c# - 基于位置的图像到内存流

c# - 像 mongdbo objectid 一样进行字节打包

visual-studio - Azure 部署防火墙问题

c++ - 在命名线程后附加调试器时, native C++ 线程名称不会显示在 visual studio 线程窗口中

c# - XNA 4.0 for xbox 问题(困惑)