我想为我的Isolated shell应用程序添加一个按钮到Visual Studio 2013中的主框架控件窗格。我不确定窗格是否被调用"主窗口框架控件",但它是菜单,其中VS 2013具有通知,快速启动和反馈按钮。
如何使用我的扩展程序向该菜单添加按钮?
答案 0 :(得分:1)
包含控件注册的注册表项位于[ver]_Config\MainWindowFrameControls
。
搜索VS的DLL(使用Telerik的JustDecompile,主要是功能性全文搜索),用于" MainWindowFrameControls"调高FrameControlManager
(在Microsoft.VisualStudio.Shell.UI.Internal程序集和Microsoft.VisualStudio.PlatformUI
名称空间中)。这会迭代注册表项,通过调用其FrameControl
方法为每个注册表创建一个Read
。 Read
方法从注册表项中填充一些属性,包括其_factoryBundle
字段。它包含视图工厂的GUID,视图ID和数据源ID(从注册表项中读取)将用于创建控件。
FrameControl
' FrameworkElement
属性(几乎可以肯定是实际显示在框架上的部分)懒惰地调用UIFactoryHelper.CreateElementAndDataSource()
,并将_factoryBundle
传递给它}。这最终会调用WindowHelper.CreateUIElement
,然后将其移交给IVsUiFactory
。最后,我们已经达到VS的一个(轻微)记录部分 - 这是公共界面的一部分。
事实证明,帧控件的视图GUID指的是" UI提供商之一" registered by a package。 (这些也可以在注册表中的_Config\UIProviders
键下看到。)
简而言之,您需要实现IVsUiFactory
接口并将其注册到IVsRegisterUIFactories
服务,然后使用C#公开(例如,使用.pkgdef或更干净)为您执行注册表操作的自定义属性)MainWindowFrameControls
中控件的注册表项下的相应值。这将允许您创建一个放置在主窗口框架中的自定义WPF框架元素。
我没有查看数据绑定,但显然这也是可能的 - 只需跟踪FrameControl
代码,直到找到它是如何工作的(使用一个好的反编译器 - 我喜欢JustDecompile用于全文搜索,dotPeek用于其界面。
P.S。嘿,另一个孤立的shell开发者!嗨&祝你好运: - )