【问题标题】:Add custom editor windows to Visual Studio window panes将自定义编辑器窗口添加到 Visual Studio 窗口窗格
【发布时间】:2013-07-20 15:19:35
【问题描述】:

我的问题

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

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

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

我的尝试

我花了将近两个星期的时间研究和尝试这些东西,但在弄清楚我将要使用哪些服务、接口和类时遇到了很多麻烦。

阅读MSDN

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

我浏览了有关我感兴趣的大量接口的文档,包括IVsTextBufferIVsTextViewIVsInvisibleEditor。不幸的是,我无法让其中一些界面很好地配合使用。

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

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

与 IVsUIShell 交互

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

我需要做什么

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

编辑:

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

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

或者:

如果有人知道我在哪里可以找到包含在 Visual Studio 2005 中的编辑器示例,例如 Basic Editor Sample,我相信我可以解决这些问题。 MSDN 文档中没有关于这些接口的代码示例,这让我的工作变得异常困难。

【问题讨论】:

  • 您想要的示例随 Visual Studios SDK 一起提供。由于它们没有显示任何更新的版本,我希望最新版本具有相同的示例
  • 没有 Visual Studio 2012 SDK 示例,但有 2010 示例。我已经浏览了所有这些,但没有一个是我提供的 VS 2005 链接中提到的。我相信 2010 年的示例旨在突出他们为该版本的 Visual Studio 添加的 WPF 接口。
  • 嗨,乔希。我在寻找完全相同类型的扩展名时遇到了您的问题(在阅读干净代码之后)。您是否有幸找到 \ 构建 Debugger Canvas 的替代方案?附言刚刚意识到,您是 Shotgun 调试 Roslyn 教程背后的人 - 感谢他们 :-)
  • 我用在这里学到的信息和我的一个朋友一起构建了codeconnect.io。但是,它是用于探索代码而不是调试代码。谢谢,很高兴你发现它们有帮助:)

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


【解决方案1】:

我实际上并没有查看@280Z28(为什么是这个用户名?)发布的文件。我曾经在 Visual Studio 编辑器上工作,而您正在尝试做的事情有多个方面,您应该独立处理:

  • 在单个 IVsWindowFrame 中托管多个命令目标(这意味着从 Visual Studio 的 shell 的角度来看,您将在同一窗格中拥有不同的元素,并且每个元素都需要有自己的命令处理。考虑这种情况您将插入符号放入其中一个迷你编辑器并希望使用 Ctrl+Z 撤消,片刻之后,您将插入符号放入另一个迷你编辑器并执行相同操作。即使 WPF 和 Win32 焦点仍保留在相同的窗口框架(从 Visual Studio Shell 的角度来看),需要将命令路由到不同的组件。
  • 使用显示另一个文档部分的编辑器。这里将成为您朋友的机制在projection namespace 中。投影本质上允许您将一块缓冲区(或多个缓冲区)投影到视图中。省略缓冲区是特殊情况的投影缓冲区,它从一个源缓冲区投影到目标视图,同时隐藏缓冲区的区域(这很可能是您想要的)。投影缓冲区的一个示例是在 cshtml 文件中发生的事情。在这种情况下,一个缓冲区包含所有 C# 代码,一个缓冲区包含所有 javascript,一个缓冲区包含 html,每个编译器都使用该缓冲区工作,但最终用户会看到所有这些缓冲区的投影到编辑器的仅显示相关部分的视图(例如,即使 C# 导入语句存在于真实的 C# 缓冲区中,它们也会被省略。)
  • 管理正在运行的文档,以便在迷你编辑器中进行编辑时,实际文档会被弄脏。您需要处理父文件已经在 RDT 中打开的情况,在这种情况下您希望在进行更改时弄脏同一个文档,以及文档未打开的情况,在这种情况下您需要创建一个新条目在 RDT 中。

另外,请发帖到Visual Studio forums,有人会定期查看论坛并将问题发送给相应的开发人员。

一般来说,当涉及到编辑器时,请避免使用任何传统界面(任何不使用 MEF 的界面),因此不应将 Visual Studio 2005 中的示例用作参考点。

如果您足够关心并且在西雅图,您可以尝试以 MVP 的身份进入校园。有些日子你来到校园,不同团队的成员会拿起笔记本电脑来到你的会议室,你可以一起调试代码或破解(同时可以访问调试符号等等)。

最后但同样重要的是,请联系code canvas 的人,我相信他们已经解决了您面临的许多问题。

【讨论】:

  • 感谢您的回复,实际上我已经在论坛上发帖了:social.msdn.microsoft.com/Forums/vstudio/en-US/… 我也联系了代码画布的人,但没有收到回复。我不在西雅图,但是一个正在做这件事的朋友很快就会到,我会告诉他的。感谢您的提示!
  • 不客气。我想告诉你一个电子邮件地址,你应该发送电子邮件,但我无法找到你的电子邮件地址(我不确定我是否可以公开分享该电子邮件)。将您的联系信息放在您的博客上! :) 给我发电子邮件至位于 triangle dot io 的ameen,以便我与您分享。
【解决方案2】:

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

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

请注意,SetDisplayedFile 方法包含几行,格式如下:

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

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

【讨论】:

  • 这看起来很有希望,至少应该把我介绍给这个 InvisibleEditor 经理。这个周末我会更多地研究这段代码。
【解决方案3】:

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

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

【讨论】:

  • 可以将其放置在工具窗格中,但您不是必需
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
相关资源
最近更新 更多