我为Outlook 2010加载项创建了一个VSTO功能区。当我以前使用设计器时,我能够动态更改功能区按钮的标签。我现在正在编写这个(XML / C#)编码,似乎无法确定如何完成同样的事情。 XML中的“label”项似乎是静态的。
仅供参考 - 这背后的目的是为用户确定图库中的项目数。
感谢。
答案 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”方法。