2017-07-27 53 views
0

我開發了Excel的VSTO 4加載項。它的工作原理非常完美,但是,我有一個按鈕放置在最初禁用的Ribbon控件的自定義選項卡中。無法以編程方式啓用功能區按鈕

在我的自定義選項卡中單擊其他功能區按鈕後,我需要啓用最初禁用的按鈕。

我試着用:

btnCancelar.Visible = true; 

在按鈕的Click事件,但按鈕不會顯示。奇怪的是,在調試時,它仍然沒有出現,但是如果顯示了一個MessageBox,那麼該按鈕最終會變得可見。

我不明白這種行爲。如何通過代碼動態地啓用或禁用功能區按鈕?

回答

0

我已經爲此創建瞭解決方法。

很簡單。剛開始不同線程的長時間運行過程。這樣,取消按鈕會在應用程序中顯示,然後在處理結束後隱藏。

我用這個代碼啓動過程中Ribbon.cs代碼:

btnCancelar.Visible = true; 

Action action =() => { 
          Formatter.GenerateNewSheet(Formatter.TargetType.ImpresionEtiquetas, frm.CustomerID, workbook, btnCancelar); 
         }; 
System.Threading.Tasks.Task.Factory.StartNew(action); 

,過程方法裏面我有這樣的代碼:

public static bool GenerateNewSheet(TargetType type, string customerID, Excel.Workbook workbook, Microsoft.Office.Tools.Ribbon.RibbonButton btnCancelar) 
    { 
     try 
     { 
      _cancelled = false; 
      InfoLog.ClearLog(); 

      switch (type) 
      { 
       case TargetType.ImpresionEtiquetas: 
        return GenerateTagPrinting(customerID, workbook); 
      } 

      return false; 
     } 
     finally 
     { 
      btnCancelar.Visible = false; 
     } 
    } 

這裏的有趣的事情,我已經發現Excel是線程安全的,因此在新工作表中添加行或者將Visible屬性再次設置爲false時,不需要添加同步機制。

問候

海梅

0

我不確定你的項目中使用了什麼語言,但我想你可以將它轉換爲你自己使用的語言。我會在這裏顯示的例子在C#:

首先,你需要實現在RibbonXML定義所謂的回調函數:

<button id="buttonSomething" label="Content" size="large" getVisible="EnableControl"/> 

那麼下一步就是實現回調函數:

public bool EnableControl(IRibbonControl control) 
{ 
    return true; // visible ... false = invisible 
} 

VSTO將觸發getVisible回調,並根據返回值啓用或禁用可見狀態(不要忘記從RibbonXML中刪除任何可見屬性,否則回調不會被觸發)

如果功能區設計器需要確保您的點擊簽名是正確的,那麼簡單的方法是雙擊功能區設計器上的按鈕。這將爲您創建Click方法,例如:

我使用Ribbon設計器創建了一個Ribbon並添加了兩個按鈕。雙擊第一個按鈕以獲得如下所示的空方法,並添加代碼。

private void button1_Click(object sender, RibbonControlEventArgs e) 
    { 
     // Toggle button visibility and make sure the button is enabled 
     // Visible (obviously) makes it visible, while Enabled is grayed if 
     // false. You don't need this it is Enabled by default, so just for 
     // demo purposes 

     button2.Visible = !button2.Visible; 
     button2.Enabled = button2.Visible; 

     // Force Ribbon Invalidate ... 
     this.RibbonUI.Invalidate(); 

     // Long running proces 
    } 

這對我很好,所以如果它不適合你,請提供你的編碼的更多細節。

+0

你好...我使用C#,以及...但是,我找不到在哪裏添加回調。我沒有RibbonXML ....我用絲帶設計師。我該如何添加回調? – jstuardo

+0

使用Ribbon設計器(稍微不靈活但適用於大多數解決方案)更容易,除非您爲方法創建了正確的「簽名」。看到我編輯的答案 –

+0

當然,它適合你。如果我使用你的代碼,它也可以工作。問題是這樣的:在使按鈕可見之後,我開始了一個長時間運行的過程。該過程用數據填充新工作表。我希望用戶能夠取消該過程......這就是爲什麼我需要在過程開始之前顯示取消按鈕的原因。但即使當我使用Application.DoEvents,button.Invalidate和更多的嘗試,當返回當前方法時,最終顯示按鈕。奇怪的是,Excel在處理過程中沒有被鎖定,因爲我可以看到行是如何填充的。 – jstuardo