我为Excel开发了一个VSTO 4加载项。它工作得很完美,但是,我在其Ribbon控件的自定义选项卡中放置了一个按钮,该按钮最初被禁用。
点击我的自定义标签中的其他功能区按钮后,我需要启用最初禁用的按钮。
我尝试过:
btnCancelar.Visible = true;
在按钮的Click事件中,但未显示按钮。奇怪的是,在调试时,它仍然没有出现,但如果显示一个MessageBox,该按钮最后会显示。
我不明白这种行为。如何通过代码动态启用或禁用功能区按钮?
答案 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