2015-12-01 62 views
1

如何重新觸發GetCustomUI()我已經在ExcelDNA,創建(延長ExcelRibbon)自定義功能區,並覆蓋了GetCustomUI()方法來創建一個字符串列表的菜單控制。基本上:從ExcelDNA

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中,以便在XML重建再次呼籲GetCustomUI?

我已經試過無效帶狀物體本身,但是這不會觸發Excel將再次調用GetCustomUI。

我能想到的(儘管我仍然對此進行測試)是創建具有無形的「佔位」按鈕的整個負載的菜單(通過指定getVisible回調),當用戶點擊退而求其次一個按鈕,就無效,需要現在變得可見,顯示出加_ItemNameList新項目的按鈕。我仍然需要考慮如何獲得正確的按鈕引用,儘管...這也感覺有點骯髒。

任何想法如何讓Excel重建色帶? 也給其他的想法開放,讓我的項目添加到菜單中的ExcelRibbon。

回答

5

我想你正在尋找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" 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> 

OnGetContent方法會被解僱每次用戶點擊功能區按鈕的時間,這樣你就可以動態地組裝項目。

例如

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

當然,你必須從你的列表中動態創建這個字符串,等等