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 回调函数一定要按照代理原型定义 


 

posted on 2012-03-26 13:28  Bean.Hsiang  阅读(3428)  评论(0编辑  收藏  举报