如何使用DynamicItemStart一个VSIX包内何时更新Visual Studio的UI(h

2019-10-19 10:37发布

我实现菜单控制器内DynamicItemStart按钮。 我加载此按钮的动态项目的Visual Studio启动时。 所以初始化方法被称为我看到所有在这个充满活力的按钮,新的项目一切正常加载。 包被完全加载后,我想更多的项目加入到这个充满活力的按钮,但由于包已经加载的初始化方法是不是又一次打来电话,我看不出在这个动态按钮,新的项目。 我只看到,当VS启动已装载的人。

有什么办法,我可以强制使用动态按钮,以便它显示了新项目的更新? 我希望能够更新UI VS后,我增加了更多的项目,但初始化方法之外。 我做的实现非常相似,一个表现出对这个MSDN例如:

http://msdn.microsoft.com/en-us/library/bb166492.aspx

有谁知道,如果用户界面的更新可以通过需求来完成?

任何提示是不胜感激。

Answer 1:

我终于得到了这个工作。 最主要的是一个派生类OleMenuCommand的实现与谓语新构造函数的实现。 这个谓词用于检查是否有新的命令是DynamicItemStart按钮内的比赛。

public class DynamicItemMenuCommand : OleMenuCommand
{
private Predicate<int> matches;
public DynamicItemMenuCommand(CommandID rootId, Predicate<int> matches, EventHandler invokeHandler, EventHandler beforeQueryStatusHandler)
  : base(invokeHandler, null, beforeQueryStatusHandler, rootId)
{
  if (matches == null)
  {
    throw new ArgumentNullException("Matches predicate cannot be null.");
  }

  this.matches = matches;
}


public override bool DynamicItemMatch(int cmdId)
{
  if (this.matches(cmdId))
  {
    this.MatchedCommandId = cmdId;
    return true;
  }

  this.MatchedCommandId = 0;
  return false;      
}

}

上述类应添加于执行时间的命令时使用。 下面是一个创建的命令代码

public class ListMenu
{
 private int _baselistID = (int)PkgCmdIDList.cmdidMRUList;    
 private List<IVsDataExplorerConnection> _connectionsList;


public ListMenu(ref OleMenuCommandService mcs)
{             
  InitMRUMenu(ref mcs);
}    

internal void InitMRUMenu(ref OleMenuCommandService mcs)
{            
  if (mcs != null)
  {               
    //_baselistID has the guid value of the DynamicStartItem 
    CommandID dynamicItemRootId = new CommandID(GuidList.guidIDEToolbarCmdSet, _baselistID);
    DynamicItemMenuCommand dynamicMenuCommand = new DynamicItemMenuCommand(dynamicItemRootId,      isValidDynamicItem, OnInvokedDynamicItem, OnBeforeQueryStatusDynamicItem);
          mcs.AddCommand(dynamicMenuCommand);                  
  }
}

private bool IsValidDynamicItem(int commandId)    
{      
  return ((commandId - _baselistID) < connectionsCount);  // here is the place to put the criteria to add a new command to the dynamic button
}


private void OnInvokedDynamicItem(object sender, EventArgs args)
{
  DynamicItemMenuCommand invokedCommand = (DynamicItemMenuCommand)sender;      

  if (null != invokedCommand)
  {
     .....
  }
}

private void OnBeforeQueryStatusDynamicItem(object sender, EventArgs args)
{
  DynamicItemMenuCommand matchedCommand = (DynamicItemMenuCommand)sender;           

  bool isRootItem = (matchedCommand.MatchedCommandId == 0);
    matchedCommand.Enabled = true;
    matchedCommand.Visible = true;
    int indexForDisplay = (isRootItem ? 0 : (matchedCommand.MatchedCommandId - _baselistID));
    matchedCommand.Text = "Text for the command";
  matchedCommand.MatchedCommandId = 0;
}  

}

我不得不审查大量的文档资料,因为它不是很清楚如何命令可在执行时间被加入。 所以,我希望这节省一些时间谁就必须实现类似的事情。



Answer 2:

对我来说,缺少的部分就是如何控制增加新的项目。

我花了一些时间来弄清楚,比赛谓词(IsValidDynamicItem方法样品中)控制很多项目将如何加入 - 只要它返回true,则OnBeforeQueryStatusDynamicItem被调用,并可以设定详细内容(已启用/可见/检查/本场比赛的文字等)被添加到菜单。



文章来源: how to update Visual Studio UI when using DynamicItemStart inside a vsix package