1

我发现自己在编写 RibbonXML UI 时重复了很多 XML。

举个例子,下面的 contextMenu

<contextMenu idMso="ContextMenuObjectsGroup">
    <!-- Lots of XML describing the items -->
</contextMenu>

现在,我还希望相同的项目出现在ContextMenuShape菜单中,所以我发现自己重复了上面的内容:

<contextMenu idMso="ContextMenuShape">
    <!-- Lots of XML describing the items -->
</contextMenu>

所有包含的控件都需要 new s 的事实加剧了这种情况Id- 并且需要调整背后的代码以响应这些新控件。

问题:

有没有办法去重复此代码并从内部(例如,contextMenus、ribbons 等)简单地引用控制组(实现一次)?

编辑 1:更多用例

我开发了几个自定义用户函数,可以应用于形状、表格、图表等。我目前将这些工具包含在选项卡集中TabSetDrawingTools。但是,我还需要将它们包含在表格和图表的相应选项卡中。

从我现在看到的情况来看,只有两种选择:

  1. 如上所述,完全复制和粘贴所有代码 - 这与任何类型的最佳实践背道而驰

  2. 以某种方式实现我的“自己的”功能区 XML 标签。然后,我阅读自己的 XML,查找诸如之类的标签<customControlGroup id="myId" />,然后以编程方式生成最终的 Ribbon XML 并将其传递给 Office。也就是说,要实现看似如此简单的事情听起来很麻烦。

编辑 2:<control />不支持的使用

功能区 XML 提供<control />标签,允许您复制/克隆内置控件。但是,根据文档(并且已经尝试过),它不适用于自定义控件和控制组(例如,通过引用它们的idor idQ)。

4

1 回答 1

1

虽然我不是 VSTO 专家,但我已经大量使用 Ribbon XML,而且我认为您尝试完成的工作无法通过 Ribbon XML 完成。但根据您的一条评论,我认为您可能会遗漏部分谜题,这将使这变得更容易。

使用常见的回调和tag

您的代码应该适应选择,而不是控件(无论如何您都需要这样做以进行错误检查),并且您可以跨多个控件使用相同的回调。如果需要进一步区分,也可以使用tag属性。只有id会有所不同,但可以忽略,并且您的代码每次都可以表现相同。

<contextMenu idMso="ContextMenuObjectsGroup">
    <control id="mycustomcontrol1" onAction="PerformChange" tag="type1" ?>
</contextMenu>
<contextMenu idMso="ContextMenuShape">
    <control id="mycustomcontrol2" onAction="PerformChange" tag="type2" ?>
</contextMenu>

public void PerformChange(IRibbonControl control)
{
    bool type1 = controlTag == "Type1";
    bool type2 = controlTag == "Type2";        

    if (/* selection contains appropriate content */)
    {
        // perform changes, checking the tag as needed
    }

}

使用 XSLT

这主要是对上一节的补充,以防止必须手动复制/粘贴每组控件。

大多数人不需要经常编写或编辑 Ribbon XML。您通常会执行一次,然后偶尔进行更改。如果您确实需要经常编写/编辑 Ribbon XML,您可以维护一个包含空<contextMenu>的 Ribbon XML 的基本副本,并且当您进行更改时,运行一个转换,将您的元素副本放入每个相关<contextMenu>的 ,具有唯一的 id(也就是说,同样,否则将被忽略)。

我个人发现这些事情很难做到恰到好处,除非你经常这样做。如果您对 XSLT 不是很熟悉,或者没有经常(每天?每周?)更改您的功能区,我怀疑所花费的任何时间都可以通过使用它来弥补。

于 2017-06-09T15:13:55.307 回答