我正在将项目添加到运行时“新电子邮件”检查器使用的RibbonDropDown
中。我在启动时添加项目,并根据需要刷新列表(当用户按下按钮时)
public void RefreshListNames()
{
Logger.Log("Refresh Mail Lists");
Globals.Ribbons.Ribbon1.rddListNames.Items.Clear();
foreach (KeyValuePair<Guid, string> kvp in _dda.GetMarketingListNames())
{
Microsoft.Office.Tools.Ribbon.RibbonDropDownItem dd =
Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
dd.Tag = kvp.Key;
dd.Label = kvp.Value;
Logger.Log("Adding " + dd.Label);
Globals.Ribbons.Ribbon1.rddListNames.Items.Add(dd);
}
Globals.Ribbons.Ribbon1.rddListNames.ResumeLayout();
}
注意:
rddListNames
是RibbonDropDown
此方法在
ThisAddIn_Startup
方法中调用,并在启动时完全填充。但是,任何新的“邮件”窗口都以空白下拉列表结尾-没有项目。即使刷新列表也不会再次添加项目。我添加了一些日志记录:它显示了按下“刷新按钮”时该方法正在运行:
23/04/2013 14:36:43 - Refresh Mail Lists
23/04/2013 14:36:45 - Adding Marketing List - Dynamic
23/04/2013 14:36:45 - Adding Marketing List - Bs
23/04/2013 14:36:45 - Adding Marketing List - As
为什么下拉菜单会不断丢失物品?而且,即使我明确地刷新了它们,为什么还不回来呢?
最佳答案
如果对Ribbon UI进行控件修改,则需要通过IRibbonControl.Invalidate()
或IRibbonControl.InvalidateControl
使控件缓存无效。这将触发功能区元素的重新绘制。
Globals.Ribbons.Ribbon1.Invalidate();
// or...
Globals.Ribbons.Ribbon1.InvalidateControl("ddMarketingList");