c# - 是否有替代 IRibbonControl.Context 的解决方法或替代方法来访问 Excel 2016 或更高版本中的正确窗口和工作簿?

标签 c# .net excel vsto ribbon

are existing posts on SO关于相关话题,有support requests on MSDN未解决/未修复的。听起来“正确的方法”不起作用,所以我想知道是否有解决方法。
让我描述一下我认为行不通的“正确方式”,也许你有一条可行的替代路径。
我可以在 Visual Studio 中创建 Excel VSTO 插件,创建自定义 Ribbon.xml 和 Ribbon.cs 文件,然后打开多个显示为不同窗口的工作簿。根据其他 SO 帖子,我可以加入 Application_WindowActivate事件和电话Invalidate()在我的功能区上,强制刷新所有回调。功能区将反射(reflect)事件窗口的状态......其他窗口中功能区的每个其他实例也是如此。因此,出现在每个窗口中的 Ribbon 是同一个 Ribbon。如果我有 CheckBoxButtonPressed属性或任何其他状态,这些状态将传播到每个打开的 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 的更多信息:

  • Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)
  • Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
  • Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)

  • 此外,您可能会发现以下链接很有帮助:
  • Chapter 11: Creating Dynamic Ribbon Customizations (1 of 2)
  • Chapter 11: Creating Dynamic Ribbon Customizations (2 of 2)
  • 关于c# - 是否有替代 IRibbonControl.Context 的解决方法或替代方法来访问 Excel 2016 或更高版本中的正确窗口和工作簿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63062282/

    相关文章:

    php - 如何使用纯 PHP 格式化带有样式、字体、颜色、表格等的 excel 文件?

    excel - 将范围从 Excel 复制到 Outlook 时如何保留格式

    arrays - Excel VBA "Type mismatch:array or user-defined type expected"

    .net - 当我的大型 ASP.NET 站点更新时,IIS 必须重新编译其中的很多内容。有没有办法显着减少我的编译时间?

    c# - 如何从另一个表单更新标签值?

    C# 线程内存使用

    c# - 如何使用EmguCV和C#绘制直方图

    .net - 无法使用权​​限 '*' 为 SSL/TLS 建立安全通道

    java - .NET 与 Java 中的正则表达式性能

    c# - C# 中的正则表达式单词拆分