2

我正在编写一个 VS2012 插件,将命令添加到 Build Explorer 上下文菜单(请参阅相关问题)。该命令被添加到 2 个不同的上下文菜单中:

  1. 构建资源管理器
  2. 团队资源管理器,构建页面,我的构建部分

当我的一个回调被调用时,我怎么知道它是哪一个?

我尝试获得集中控制(使用 P/Invoke,正如这个问题所暗示的那样)。但是,它为 (1) 提供了一个 Tabs 容器,为 (2) 提供了 null。我可以尝试将控件投射到选项卡式容器,但这听起来很糟糕......

有更好的选择吗?

4

2 回答 2

0

我的新/其他想法 - 它与您的相似:

您应该尝试监视最后激活的窗口。

如果你为你的命令创建了一个事件处理程序,那么你可以在你的命令触发时检查哪个窗口是活动的。命令的简单事件处理程序:

void cmdEvents_BeforeExecute( string guid, int ID, object customIn, object customOut, ref bool cancelDefault )
{
  Window2 teamExplorer = _applicationObject.Windows.Item("Team Explorer") as Window2;
  if (_applicationObject.ActiveWindow.Caption == teamExplorer.Caption)
  {
       //You are called from Team Explorer
  }
  else
  {
       //Somewhere else
  }
}

以及您可以订阅的方式:

static _dispCommandEvents_BeforeExecuteEventHandler _myHandler;
static CommandEvents _cmdEvents;

public void OnConnection(...)
{
   Command command = ...; // Init your command 
   int ID = command.ID;
   string GUID = command.Guid;

   CommandEvents _cmdEvents = _applicationObject.Events.get_CommandEvents(GUID, ID);

   _myHandler = new _dispCommandEvents_BeforeExecuteEventHandler(cmdEvents_BeforeExecute);

   _cmdEvents.BeforeExecute += _myHandler;
}

您可能会找到一种更好的方法来通过 GUID 识别窗口。您应该至少保持_cmdEvents静态,因为当它被销毁时,您的事件处理程序可能会消失(至少对于内部命令)。

在 OnDisconnection 中,您应该取消订阅。

于 2013-12-24T15:02:43.123 回答
0

由评论重做,并建立链接:

由于菜单项显示在每个地方,似乎无法将它们与加载项区分开来,您应该添加两个命令并根据它们的上下文区分它们。

代替将加载项转换为 VS 包MZ-Tools HOWTO: Controlling the state of command in a Visual Studio add-in 的方法,尝试 MZ-Tools HOWTO: Use the IVsMonitorSelection ...您也可以从一个加载项。

但:

AddNamedCommand 和 QueryStatus 方法都不尊重不可见状态:必须不可见的按钮......保持禁用而不是不可见。

我认为这使得无法通过加载项以合适的方式执行此操作,但也许您可以检查上下文。

如果您尝试将命令/菜单迁移到 VSPackage 并UIContext为菜单项创建自定义项或找到合适的预定义项,则可以通过其他方式走得更远。我无法访问使用 Build Explorer 增强的 Studio,因此无法尝试。

以下讨论是关于 vs-packages 的自定义上下文:http: //davedewinter.com/2008/04/05/dynamic-menu-commands-in-visual-studio-packages-part-3/
遗憾的是链接已断开帖子,我无法到达第 1 部分和第 2 部分。这是从一开始就对问题的讨论。但是不能保证您可以创建适合您的上下文。

我为 Team Explorer 找到的唯一上下文 ID 是guidTeamProjectCmdUIContext. 它位于 Visual Studio 2010 SDK 中的 vsshilds.h 中,vsshell*.h 还包含其他几个。

MSDN:用于定义命令、菜单等的Vsct 文件。从包裹。

Condition项目属性:http:
//msdn.microsoft.com/en-us/library/bb491718.aspx
http://msdn.microsoft.com/en-us/library/bb166515.aspx

MSDN:命令和工具栏的 VisibilityItem 元素。

VisibilityItem 元素确定命令和工具栏的静态可见性。...加载 VSPackage 后,Visual Studio 期望命令可见性由 VSPackage 而不是 VisibilityItem 确定。

最后关于预定义的上下文指南:http:
//msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx
http://msdn.microsoft.com/en-us/library/ microsoft.visualstudio.shell.interop.uicontextguids.aspx

于 2013-12-23T12:21:05.703 回答