C# 刷新VSTO选项卡';s每次单击特定选项卡时获取可见状态

C# 刷新VSTO选项卡';s每次单击特定选项卡时获取可见状态,c#,excel,vsto,C#,Excel,Vsto,我正在开发一个VSTO Excel加载项2010项目 我试图通过检查计算机上是否安装了特定的程序来确定“isInstalled”选项卡是否可见。因此,我在选项卡中添加了getVisible属性,并编写了一个回调函数来检查并返回true或false public bool IsInstalled(Office.IRibbonControl control) { if(isSoftwareinstalled(control.id)) return true; return false

我正在开发一个VSTO Excel加载项2010项目

我试图通过检查计算机上是否安装了特定的程序来确定“isInstalled”选项卡是否可见。因此,我在选项卡中添加了getVisible属性,并编写了一个回调函数来检查并返回true或false

public bool IsInstalled(Office.IRibbonControl control)
{
    if(isSoftwareinstalled(control.id)) return true;
    return false;
}


然而,在测试时,我发现getVisible仅在我第一次单击选项卡时更新。除非我重新启动程序,否则它将不会再次更新。我想知道是否有一种方法可以让选项卡在每次单击时更新其getVisible状态。

您的选择是正确的。所有值都由Fluent UI缓存。如果需要重新调用回调,即重新计算缓存值,则需要使用以下方法:

XML
-----------------------------------------
VB
伊里布努伊的暗米里布翁
子MyAddInInitialize(功能区作为IRibbonUI)
设置MyRibbon=Ribbon
端接头
子函数()
MyRibbon.Invalidate()'使所有外接程序控件的缓存无效
端接头

也可以考虑使用在色带用户界面上对单个控件的缓存值无效的方法。

XML

<customUI … OnLoad="MyAddInInitialize" …>

-----------------------------------------

VB

Dim MyRibbon As IRibbonUI 

Sub MyAddInInitialize(Ribbon As IRibbonUI) 
 Set MyRibbon = Ribbon 
End Sub 

Sub myFunction() 
 MyRibbon.InvalidateControl("control1") ' Invalidates the cache of a single control 
End Sub

XML
-----------------------------------------
VB
伊里布努伊的暗米里布翁
子MyAddInInitialize(功能区作为IRibbonUI)
设置MyRibbon=Ribbon
端接头
子函数()
MyRibbon.InvalidateControl(“control1”)'使单个控件的缓存无效
端接头

你在正确的道路上。所有值都由Fluent UI缓存。如果需要重新调用回调,即重新计算缓存值,则需要使用以下方法:

XML
-----------------------------------------
VB
伊里布努伊的暗米里布翁
子MyAddInInitialize(功能区作为IRibbonUI)
设置MyRibbon=Ribbon
端接头
子函数()
MyRibbon.Invalidate()'使所有外接程序控件的缓存无效
端接头

也可以考虑使用在色带用户界面上对单个控件的缓存值无效的方法。

XML

<customUI … OnLoad="MyAddInInitialize" …>

-----------------------------------------

VB

Dim MyRibbon As IRibbonUI 

Sub MyAddInInitialize(Ribbon As IRibbonUI) 
 Set MyRibbon = Ribbon 
End Sub 

Sub myFunction() 
 MyRibbon.InvalidateControl("control1") ' Invalidates the cache of a single control 
End Sub

XML
-----------------------------------------
VB
伊里布努伊的暗米里布翁
子MyAddInInitialize(功能区作为IRibbonUI)
设置MyRibbon=Ribbon
端接头
子函数()
MyRibbon.InvalidateControl(“control1”)'使单个控件的缓存无效
端接头

谢谢您的回答。我听说过无效方法。但是,我仍然有一些问题,我可以把InvalidateControl(control.id)放在哪里,这样它就可以确保每次单击特定按钮时,它都会自动更新getVisible。换句话说,在您的回答中,我在哪里可以调用myFunction()使InvalidateControl有效。选项卡没有类似于“onaction”的事件,您必须在其他有意义的时间运行它。在
单击事件处理程序中,您可以调用
IRibbonUI
界面的
InvalidateControl
方法。要获取接口实例,您需要处理
onLoad
事件/回调。谢谢您的回答。我听说过无效方法。但是,我仍然有一些问题,我可以把InvalidateControl(control.id)放在哪里,这样它就可以确保每次单击特定按钮时,它都会自动更新getVisible。换句话说,在您的回答中,我在哪里可以调用myFunction()使InvalidateControl有效。选项卡没有类似于“onaction”的事件,您必须在其他有意义的时间运行它。在
单击事件处理程序中,您可以调用
IRibbonUI
界面的
InvalidateControl
方法。要获取接口实例,需要处理
onLoad
事件/回调。
XML

<customUI … OnLoad="MyAddInInitialize" …>

-----------------------------------------

VB

Dim MyRibbon As IRibbonUI 

Sub MyAddInInitialize(Ribbon As IRibbonUI) 
 Set MyRibbon = Ribbon 
End Sub 

Sub myFunction() 
 MyRibbon.InvalidateControl("control1") ' Invalidates the cache of a single control 
End Sub