动态更改功能区标签

时间:2011-08-25 19:44:21

标签: c# vsto

我为Outlook 2010加载项创建了一个VSTO功能区。当我以前使用设计器时,我能够动态更改功能区按钮的标签。我现在正在编写这个(XML / C#)编码,似乎无法确定如何完成同样的事情。 XML中的“label”项似乎是静态的。

仅供参考 - 这背后的目的是为用户确定图库中的项目数。

感谢。

2 个答案:

答案 0 :(得分:4)

您可以在元素上设置 getLabel 属性。该值是回调函数的名称,该函数被调用以动态提供标签名称。您可以以编程方式刷新UI以强制调用所有回调。

答案 1 :(得分:0)

这应该适用于使用C#的excel和Outlook。

根据您的问题,我将假设您可以创建xml的大部分内容,以将按钮放到功能区上,因此我将跳过该部分。您也没有提到哪种事件应该更改标签按钮,所以我假设单击按钮会导致标签文本更改。

首先将按钮xml代码放入位置

<button id="YourUniqueId" onAction="YourUniqueId_Click" getLabel="GetYourLabelText">

创建一个类级别变量,构造器之前的Ribbon类中的所有方法都可以访问该类级别的变量,然后在构造函数中设置该值。您还需要功能区UI类变量。当功能区使用xml中的加载方法(例如onLoad =“ Ribbon_Load”)加载功能区时,应实例化此变量。

public class Ribbon: Office.IRibbonExtensibility
{
    private bool _buttonClicked;
    private Office.RibbonUI ribbon;

    public Ribbon()
    {
       _buttonClicked = false;
    }

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        ribbon = ribbonUI;
    }
}

接下来,在功能区类中,您将需要两个类“ YourUniqueId_Click”和“ GetYourLabelText”。

public void YourUniqueId_Click(Office.IRibbonControl Control)
{
    //Since the initial value is false and presumably the user just clicked for 
    //the first (or N-th) time you'll want to set the value to true
    if(!_buttonClicked)
    {
        _buttonClicked = true;
    }
    //Or if clicking for a second (or N-th + 1) time, set the value to false
    else
    {
        _buttonClicked = false;
    }

    //Now use the invalidate method from the ribbon variable (from the load method) 
    //to reset the specific control id (in this case "YourUniqueId") from the xml. 
    //Invalidating the control will call the method "GetYourLabelText"
    ribbon.InvalidateControl(Control.Id);      
}

public string GetYourLabelText(Office.IRibbonUI Control)
{
    if(_buttonClicked)
    {
        return "Button is On";
    }
    else
    {
        return "Button is Off";
    }
}

功能区最初加载到Outlook或Excel中时,将运行“ GetYourLabelText”方法。由于在构造函数中将类变量“ _buttonClicked”设置为false,因此按钮标签将从“ Button is Off”开始。每次单击按钮时,“ _ buttonClicked”都会更改布尔状态,然后重置按钮,再次调用“ GetYourLabelText”方法。