无法以编程方式启用功能区按钮

时间:2017-07-27 20:50:46

标签: vsto excel-addins ribbon-control

我为Excel开发了一个VSTO 4加载项。它工作得很完美,但是,我在其Ribbon控件的自定义选项卡中放置了一个按钮,该按钮最初被禁用。

点击我的自定义标签中的其他功能区按钮后,我需要启用最初禁用的按钮。

我尝试过:

btnCancelar.Visible = true;

在按钮的Click事件中,但未显示按钮。奇怪的是,在调试时,它仍然没有出现,但如果显示一个MessageBox,该按钮最后会显示。

我不明白这种行为。如何通过代码动态启用或禁用功能区按钮?

2 个答案:

答案 0 :(得分:1)

我不确定您的项目中使用的语言是什么,但我猜您可以将其转换为您自己使用的语言。我将在C#中显示示例:

首先,您需要在RibbonXML定义中实现所谓的回调函数:

<button id="buttonSomething" label="Content" size="large"  getVisible="EnableControl"/>

然后下一步是实现回调函数:

public bool EnableControl(IRibbonControl control) 
{
    return true; // visible ... false = invisible
}

VSTO将触发getVisible回调,并根据返回值启用或禁用可见状态(不要忘记从RibbonXML中删除任何Visible属性,否则不会触发回调)

如果功能区设计器需要确保您的Click签名是正确的,那么通过双击功能区设计器上的按钮可以轻松实现。这将为您创建Click方法,例如:

我使用功能区设计器创建了一个功能区,并添加了两个按钮。双击第一个按钮以获得如下所示的空方法,并添加代码。

    private void button1_Click(object sender, RibbonControlEventArgs e)
    {
        // Toggle button visibility and make sure the button is enabled
        // Visible (obviously) makes it visible, while Enabled is grayed if
        // false. You don't need this it is Enabled by default, so just for
        // demo purposes

        button2.Visible = !button2.Visible;
        button2.Enabled = button2.Visible;

        // Force Ribbon Invalidate ...
        this.RibbonUI.Invalidate();

        // Long running proces
    }

这对我来说非常有用,所以如果它对您不起作用,请提供更多有关编码的详细信息。

答案 1 :(得分:0)

我为此创建了一个解决方法。

很简单。刚刚在不同的线程中启动了长时间运行的进程这样,取消按钮会在应该显示时显示,然后在过程结束后隐藏。

我使用此代码在Ribbon.cs代码中启动该过程:

    public static bool GenerateNewSheet(TargetType type, string customerID, Excel.Workbook workbook, Microsoft.Office.Tools.Ribbon.RibbonButton btnCancelar)
    {
        try
        {
            _cancelled = false;
            InfoLog.ClearLog();

            switch (type)
            {
                case TargetType.ImpresionEtiquetas:
                    return GenerateTagPrinting(customerID, workbook);
            }

            return false;
        }
        finally
        {
            btnCancelar.Visible = false;
        }
    }

在流程方法中我有这段代码:

{{1}}

我发现有趣的是Excel是线程安全的,所以没有必要在新工作表中添加行时再添加同步机制,也不必再次将Visible属性设置为false。

此致

的Jaime