C#VSTO - 动态设置RibbonControl

时间:2013-10-06 11:44:06

标签: c# combobox vsto ribbon-control

我在Word中有自定义功能区。功能区有一个组合框: comboBox_recentConditions ,它是使用Designer定义的 - 所以它是初始化的并且在加载时是空的。现在,我想在每次触发Application_WindowActivate事件时动态设置此comboBox。

每个Word文档都有自己的类实例,名为 RibbonControls

class RibbonControls
{
    private RibbonComboBox recentConditionComboBox;

    public RibbonControls()
    {
        this.recentConditionComboBox = new RibbonComboBox();
    }

    public RibbonComboBox RecentConditionComboBox
    {
        get
        {
            return recentConditionComboBox;
        }
        set
        {
            recentConditionComboBox = value;
        }
    }
}

现在在Application_WindowActivate事件中,我执行以下操作:

    static void Application_WindowActivate(Document doc, Window Wn)
    {
        Globals.Ribbons.SourceRibbon.comboBox_recentConditions = WordGate.docRibbonControls.RecentConditionComboBox; 
    }

问题是,即使在调用Application_WindowActivate之后,Ribbon comboBox控件也不会更改,它始终为空。 我在运行时测试,看看每个文档是否确实有自己的comboBox及其项目 - 这似乎有效。 我错过了什么?

要清除我的问题: 假设我在comboBox.Items中有3个项目。点击它时我什么都没看到,但是如果我添加它:

MessageBox.Show(Globals.Ribbons.SourceRibbon.comboBox_recentConditions.Items.Count.ToString());

Application_WindowActivate的末尾,它将打印数字3。

感谢。

1 个答案:

答案 0 :(得分:0)

你不能那样做。请阅读Ribbon callbacks

您必须使用getItemLabel事件,该事件会将项目添加到组合框中。如果您想在WindowActivate期间加载组合框,请拨打Ribbon.InvalidateRibbon.InvalidateControl,这将调用所有相关的功能区回调。