VSTO中自定义XML功能区实现Ribbon控件互相更新
一般在VSTO中,使用可视化编辑器来进行Ribbon功能区的开发,控件之间的引用和修改属性值与winform开发没有区别,是非常方便的,但为了实现更复杂的功能,不得不转到XML编辑器下的开发,但似乎控件间的互相访问就不是那么直接了,因为XML设计器使用了在fluent ui下大量的回调机制,也就是说,每个控件的属性的修改一定要通过回调方法,另一方面由于有缓存机制在,界面的更新还需要由InvalidateControl来触发。
如下示例,展示了通过点击按钮修改label控件的值。
<?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> <ribbon> <tabs> <tab idMso="TabAddIns"> <group id="MyGroup" label="My Group"> <labelControl id="mylabel" getLabel="GetLabel"/> <button id="mybutton" label="Click Me" onAction="Click"/> </group> </tab> </tabs> </ribbon> </customUI>
代码部分添加:
private string _label = "Label";
public string GetLabel(Office.IRibbonControl control)
{
return _label;
}
public void Click(Office.IRibbonControl control)
{
_label = "Changed By Button";
ribbon.InvalidateControl("mylabel");
}
注意这样几点:
1 在XML中labelControl的label和getLabel不能同时出现,否则vsto启动时看不到label控件
2 所有控件至少有一个id属性,否则vsto启动时看不到控件
3 回调函数一定要按照代理原型定义