【问题标题】:How to add a button to the Main Window Frame Control pane in visual studio 2013?如何在 Visual Studio 2013 的主窗口框架控制窗格中添加一个按钮?
【发布时间】:2015-03-18 17:27:36
【问题描述】:

我想为我的独立外壳应用程序添加一个按钮到 Visual Studio 2013 的主框架控制窗格。我不确定窗格是否称为“主窗口框架控制”,但它是 VS 2013 的菜单通知、快速启动和反馈按钮。

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

【问题讨论】:

  • 这里可以截屏。

标签: c# wpf visual-studio visual-studio-2013 visual-studio-extensions


【解决方案1】:

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

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

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

原来框架控件的视图 GUID 引用了“UI Providers”之一registered by a package。 (这些也可以在注册表中的_Config\UIProviders 键下看到。)

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

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


附:嘿,另一个孤立的 shell 开发者!嗨,祝你好运:-)

【讨论】:

  • 在查看了一些反编译的代码之后,我已经实现了 UIFactory 部分并使其正常工作。此外,我之前还看到了 FrameControlManager 模块,现在图片有些清晰了。将检查注册表操作的数据绑定和干净的自定义属性。感谢您的回答和提示 :) 对于 UI Providers Registry 修改,使用了属性 ProvideUIProvider。
  • 啊酷,不知道ProvideUIProvider,这比我写你的属性的建议要简单。如果您仍然无法让 UI 工厂正常工作,请告诉我。
  • ProviderUIProvider 未向 MainWINdowFrameControls 添加键,使用 pkgdef 进行 MainWindowFrameControls reg 修改。经过长时间的调试,让 UI 工厂正常工作。 (一个错位的 dll 和资源问题)。谢谢
  • 我可以放一个按钮,但按钮看起来死了。没有任何活动有效。如果我双击我的按钮,它将调整我的独立应用程序的大小,就像按钮不存在一样。知道为什么会这样。
  • @ted:嗯,不,对不起。我自己从未尝试过这样做。我建议将您的代码与本机按钮的代码之一进行比较,看看有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多