Как повторно запустить GetCustomUI() из ExcelDNA

Я создал в 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.


person pcbulldozer    schedule 01.12.2015    source источник


Ответы (1)


Я думаю, вы ищете элемент управления dynamicMenu, который запускает событие, позволяющее динамически устанавливать содержимое меню каждый раз, когда вы нажимаете на него.

введите здесь описание изображения

Что-то вроде этого:

<?xml version="1.0" encoding="utf-8" ?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad">
  <ribbon>
    <tabs>
      <tab id="MyAwesomeRibbon" label="My Awesome Ribbon">
        <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>

Ваш метод OnGetContent будет запускаться каждый раз, когда пользователь нажимает кнопку на ленте, поэтому вы можете динамически собирать элементы.

e.g.

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;
}

Конечно, вам придется динамически создавать эту строку из вашего списка и т. д.

person C. Augusto Proiete    schedule 02.12.2015
comment
Есть ли способ передать аргумент обработчику кликов? - person user626528; 19.02.2020