Я создал в ExcelDNA настраиваемую ленту (расширяющую ExcelRibbon) и переопределил метод GetCustomUI() для создания элемента управления меню из списка строк. В принципе:
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().
В качестве доказательства концепции метод onAction
добавит новый элемент в _ItemNameList
, когда пользователь щелкнет элемент меню.
Но как заставить Excel снова вызывать GetCustomUI, чтобы перестроить XML?
Я попытался аннулировать сам объект ленты, но это не приводит к тому, что Excel снова вызывает GetCustomUI.
Следующее лучшее, что я могу придумать (хотя мне еще предстоит это проверить), - это создать меню с целым набором невидимых кнопок-заполнителей (путем указания обратных вызовов getVisible), и когда пользователь нажимает на кнопку, просто сделать недействительной кнопку, которая теперь должна стать видимой, показывая новый элемент, добавленный в _ItemNameList
. Мне все еще нужно подумать, как получить правильную ссылку на кнопку... Это также кажется немного грязным.
Любые идеи, как заставить Excel перестроить ленту? Также открыт для других идей, позволяющих мне добавлять элементы в меню в ExcelRibbon.