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


 

你可能感兴趣的:(xml)