我实现菜单控制器内DynamicItemStart按钮。 我加载此按钮的动态项目的Visual Studio启动时。 所以初始化方法被称为我看到所有在这个充满活力的按钮,新的项目一切正常加载。 包被完全加载后,我想更多的项目加入到这个充满活力的按钮,但由于包已经加载的初始化方法是不是又一次打来电话,我看不出在这个动态按钮,新的项目。 我只看到,当VS启动已装载的人。
有什么办法,我可以强制使用动态按钮,以便它显示了新项目的更新? 我希望能够更新UI VS后,我增加了更多的项目,但初始化方法之外。 我做的实现非常相似,一个表现出对这个MSDN例如:
http://msdn.microsoft.com/en-us/library/bb166492.aspx
有谁知道,如果用户界面的更新可以通过需求来完成?
任何提示是不胜感激。
我终于得到了这个工作。 最主要的是一个派生类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;
}
}
我不得不审查大量的文档资料,因为它不是很清楚如何命令可在执行时间被加入。 所以,我希望这节省一些时间谁就必须实现类似的事情。
对我来说,缺少的部分就是如何控制增加新的项目。
我花了一些时间来弄清楚,比赛谓词(IsValidDynamicItem方法样品中)控制很多项目将如何加入 - 只要它返回true,则OnBeforeQueryStatusDynamicItem被调用,并可以设定详细内容(已启用/可见/检查/本场比赛的文字等)被添加到菜单。
文章来源: how to update Visual Studio UI when using DynamicItemStart inside a vsix package