【问题标题】:Ribbon XML: Reusing UI Elements to Keep Code `DRY`功能区 XML:重用 UI 元素以保持代码“干燥”
【发布时间】:2017-06-06 22:22:38
【问题描述】:

我发现自己在编写 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>

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

问题:

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

编辑 1:更多用例

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

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

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

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

编辑 2:不支持使用 &lt;control /&gt;

Ribbon XML 提供&lt;control /&gt; 标签,允许您复制/克隆内置控件。但是,根据documentation(并且已经尝试过),它不适用于自定义控件和控件组(例如,通过引用它们的ididQ)。

【问题讨论】:

    标签: vsto office-interop ribbon ribbon-control ribbonx


    【解决方案1】:

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

    使用常用回调和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,您可以维护一个包含空 &lt;contextMenu&gt; 的 Ribbon XML 的基本副本,并且当您进行更改时,运行一个转换,将您的元素副本放入每个相关的&lt;contextMenu&gt;,都有一个唯一的 id(也就是说,同样,否则会被忽略)。

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

    【讨论】:

    • 感谢您的回答,并指出一些非常重要的设计注意事项,这将使我的生活更轻松一些。 IE。使代码行为适应 UI,反之亦然。我也很欣赏我寻求的功能区 XML 重用是不可能的——这只是我想要实现的东西,因为在可预见的未来,我的 UI 在最终稳定之前一直在不断变化。在那之前,我实现了&lt;controlReference /&gt; 标签,通过在我的控制组的tag 属性中读取JSON 元数据来模拟我想要的东西。无论如何,再次感谢!这是我声誉的 10%! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多