如何从ExcelDNA重新触发GetCustomUI()

我在ExcelDNA中创build了一个自定义function区(扩展ExcelRibbon),并重写了GetCustomUI()方法以从string列表创build菜单控件。 基本上:

public override string GetCustomUI(string RibbonID) { string customUIXml = @"<customUI xmlns='http://schemas.microsoft.com/office/2006/01/customui' loadImage='LoadImage' onLoad='OnRibbonLoaded' > <ribbon> <tabs> <tab id='CustomTab' label='My Dynamic Tab'> <group id='SampleGroup' label='My Sample Group'> <menu description='description' enabled='true' id='menuItem' visible='true' size='normal' >"; foreach (string itemName in _ItemNameList) customUIXml += $"<button id='btn_tool_{itemName}' label='{itemName}' onAction='MyMethod' />"; customUIXml += @"</menu> </group > </tab> </tabs> </ribbon> </customUI>"; return customUIXml; } 

由于_ItemNameList是从不同的文件/系统中检索的,我不能直接将这个customUI标签放在.dna文件中(据我所知),因此我通过GetCustomUI()来加载它。

作为概念validation,当用户点击一个菜单项时, onAction方法将为_ItemNameList添加一个新的项目。

但是,如何让Excel再次调用GetCustomUI以重buildXML?

我曾尝试无效的function区对象本身,但这不会触发Excel再次调用GetCustomUI。

我能想到的下一个最好的事情(尽pipe我仍然要testing)是创build一个菜单,包含一个不可见的“占位符”button(通过指定getVisiblecallback),当用户点击一个button时使需要现在变得可见的button无效,显示添加到_ItemNameList的新项目。 我仍然需要考虑如何获得正确的button引用,虽然…这也感觉有点肮脏。

任何想法如何有Excel重buildfunction区? 也打开其他想法,让我可以添加项目在ExcelRibbon中的菜单。

我想你正在寻找dynamicMenu控件,它会触发一个事件让你dynamic设置菜单的内容,每次点击它。

像这样的东西:

 <?xml version="1.0" encoding="utf-8" ?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad"> <ribbon> <tabs> <tab id="MyAwesomeRibbon" getLabel="GetLabel" keytip="-"> <group id="MyDynamicGroup" label="Hello Dynamic!"> <dynamicMenu id="MyDynamicMenu" label="Click for Awesome" getContent="OnGetContent" invalidateContentOnDrop="true" size="large" imageMso="HappyFace" /> </group> </tab> </tabs> </ribbon> </customUI> 

每次用户点击function区button时,您的OnGetContent方法都会被触发,因此您可以dynamic组装这些项目。

例如

 public string OnGetContent(IRibbonControl control) { var menuXml = @" <menu xmlns='http://schemas.microsoft.com/office/2006/01/customui' itemSize='large'> <button id='SaveButton' label='Save' onAction='OnSave' imageMso='FileSave' /> <button id='AboutButton' label='About...' onAction='OnAbout' imageMso='FileDocumentInspect' /> </menu>"; return menuXml; } 

当然,你必须从列表中dynamic地创build这个string,等等。