有are existing posts on SO关于相关话题,有support requests on MSDN未解决/未修复的。听起来“正确的方法”不起作用,所以我想知道是否有解决方法。
让我描述一下我认为行不通的“正确方式”,也许你有一条可行的替代路径。
我可以在 Visual Studio 中创建 Excel VSTO 插件,创建自定义 Ribbon.xml 和 Ribbon.cs 文件,然后打开多个显示为不同窗口的工作簿。根据其他 SO 帖子,我可以加入 Application_WindowActivate
事件和电话Invalidate()
在我的功能区上,强制刷新所有回调。功能区将反射(reflect)事件窗口的状态......其他窗口中功能区的每个其他实例也是如此。因此,出现在每个窗口中的 Ribbon 是同一个 Ribbon。如果我有 CheckBox
或 Button
与 Pressed
属性或任何其他状态,这些状态将传播到每个打开的 Excel 窗口。
这可以通过使用 excel /s
运行 Excel 来避免。这个参数似乎用自己的 SDI 创建了一个新进程 - 但这不是一个用户友好的解决方案。
看起来像你 假设 能够在 onAction
期间进行功能区回调是访问 IRibbonControl
参数Context
属性,应该是正确的Excel.Window
目的。从理论上讲,这将仅显示您正在激活的窗口,或者将为每个打开的窗口执行。并使用正确的 Context
您可以执行将不同状态提供回功能区的函数。然后也许在一个 Excel 窗口中,您的功能区可能有 Pressed
Button
,在另一个窗口中,未按下的 Button
.除非它不起作用。
当我调用 Invalidate
我收到两个新激活窗口的回调(不知道为什么,MSDN 说这可能是一个错误),我执行逻辑来更新事件窗口功能区的状态。然后前一个窗口的功能区以同样的方式更新。
如果是这样的话,很好。我们会告诉我们的用户,他们可能会在非事件窗口上看到一些时髦的功能区更改,但在事件窗口上总是正确的。我们可以处理。但是如果有是 解决这个问题的方法可以使它看起来好像功能区在每个工作簿/窗口的基础上具有不同的状态......那真的很酷。
最佳答案
你在正确的道路上。只有事件窗口会调用回调并刷新其值。如果您希望功能区 UI 无效,则必须切换到另一个 Excel 窗口。对于加载项实现的每个回调,响应都会被缓存。例如,如果外接程序编写器为按钮实现 getImage 回调过程,则调用该函数一次,加载图像,然后如果需要更新图像,则使用缓存的图像而不是调用该过程。此过程保持原位,直到加载项使用 Invalidate
发出缓存值无效的信号。方法,此时再次调用回调过程并缓存返回响应。然后插件可以通过调用 Refresh
来强制立即更新 UI。方法。
您还可以考虑在自定义属性中缓存 UI 设置。一旦自定义属性发生更改,您可能会触发 UI 更新。
在以下系列文章中阅读有关 Fluent UI 的更多信息:
此外,您可能会发现以下链接很有帮助:
关于c# - 是否有替代 IRibbonControl.Context 的解决方法或替代方法来访问 Excel 2016 或更高版本中的正确窗口和工作簿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63062282/