如何在 visual studio 2013 中向主 Window 框架控制面板添加按钮?

How to add a button to the Main Window Frame Control pane in visual studio 2013?

我想在 Visual Studio 2013 的主框架控制窗格中为我的独立 shell 应用程序添加一个按钮。我不确定窗格是否被调用 "Main Window Frame Control",但是这是 VS 2013 具有通知、快速启动和反馈按钮的菜单。

如何使用我的扩展程序向该菜单添加按钮?

包含控件注册的注册表项位于 [ver]_Config\MainWindowFrameControls

搜索 VS 的 DLL(使用 Telerik 的 JustDecompile,它主要具有全文搜索功能)"MainWindowFrameControls" 出现 FrameControlManager(在 Microsoft.VisualStudio.Shell.UI.Internal 程序集和 Microsoft.VisualStudio.PlatformUI 命名空间)。这会迭代注册表项,通过调用其 Read 方法为每个填充的注册表项创建一个 FrameControlRead 方法从注册表项填充一些属性,包括它的 _factoryBundle 字段。这包含将用于创建控件的视图工厂的 GUID、视图 ID 和数据源 ID(从注册表项中读取)。

FrameControlFrameworkElement 属性(这几乎肯定是实际显示在框架上的部分)懒惰地调用 UIFactoryHelper.CreateElementAndDataSource(),将 UIFactoryHelper.CreateElementAndDataSource() 传递给它 _factoryBundle。这最终会调用 WindowHelper.CreateUIElement,它会依次将其交给 IVsUiFactory。最后,我们到达了 VS 的(轻微)文档化部分——这是 public 接口的一部分。

原来框架控件的视图GUID指的是"UI Providers"registered by a package之一。 (这些也可以在注册表中的 _Config\UIProviders 项下看到。)

简而言之,您需要实现 IVsUiFactory 接口并将其注册到 IVsRegisterUIFactories 服务,然后公开(例如,使用 .pkgdef 或更干净地使用 C#为您执行注册表操作的自定义属性)MainWindowFrameControls 中您控件的注册表项下的相应值。这将允许您创建一个自定义 WPF 框架元素,该元素放置在主 window 框架中。

我没有研究数据绑定,但显然这也是可能的 - 只需跟踪 FrameControl 代码直到你发现它是如何工作的(使用一个好的反编译器 - 我喜欢 JustDecompile 的组合它的全文搜索,以及它的界面的 dotPeek)。


P.S。嘿,另一个孤立的 shell 开发者!你好,祝你好运:-)