RibbonControl属性callback(getPressed,getSupertip等)永不更新

虽然可以直接设置一些办公室function区控件属性(如标签),但大多数都使用callback来设置属性。 例如一个button的图像:

<button id="btnRecalculate" getImage="GetRibbonControlImage" label="Recalculate Now" onAction="OnButtonAction" size="normal" /> 

文档在这些callback的语法上非常清晰,而不是在什么时候调用这些callback。

我现在面临的一个问题是,当编程改变一个值时,我想修改function区上的一个属性(例如button上的工具提示)。 我有一个为supertip定义的callback,如下所示:

 <button id="btnSetServerURL" getSupertip="GetSuperTip" label="Set Server URL" /> 

和代码隐藏:

 public string GetSuperTip(IRibbonControl control) { switch( control.Id ) { case "btnSetServerURL": return "Click to set the server URL. (Currently: " + API.URL + ")"; default: return ""; } } 

当URL被改变时,下一次用户将鼠标移动到该button上时,我希望调用GetSuperTipcallback,并显示正确的当前URL,但是现在这个值只是第一次被设置,而不会再次被设置。

有什么办法可以得到我所寻求的行为吗? 这是一个Excel加载项,所以据我所知WPF样式绑定不是一个选项。

正如您发现的那样,Excel会cachingfunction区控件的状态。 要做你想做的唯一的方法是每当你有一个状态改变影响他们,使function区/控件失效。 所以在你的情况下,每当API.URL改变,你需要手动无效的function区或控件。

1)在customUI XML中包含onLoad属性。

 <customUI ... onLoad="OnRibbonLoad" ...> ... </customUI> 

2)在你的callback中,存储function区界面:

 private IRibbonUI _ribbon; public void OnRibbonLoad(IRibbonUI ribbon) { _ribbon = ribbon; } 

3)稍后,当状态改变影响function区时,使function区或其控件失效:

  ... _ribbon.Invalidate(); // or // _ribbon.InvalidateControl("YourControlID"); ...