如何在RibbonX编辑器中实现集成Gallery的SplitButton?
可以通过两种方式实现需求,既整合Gallery控件,又避免额外点击的繁琐操作:
方式1:将Gallery直接嵌入SplitButton的Menu
直接在SplitButton的<menu>中放置<gallery>,同时给SplitButton的主按钮绑定常用颜色的触发逻辑——常用1-2种颜色直接点击主按钮即可,其他颜色通过下拉展开的Gallery选择,无需额外点击层级。
修改后的Ribbon XML代码:
<splitButton id="Splitbutton" size="normal"> <!-- 主按钮:绑定常用颜色的快速触发逻辑 --> <button id="btn_QuickColor" label="常用颜色" getImage="GetButtonImage" onAction="OnQuickColorClick" /> <!-- 下拉菜单直接嵌入Gallery,展开即显示颜色选项 --> <menu id="menu_ColorGallery" itemSize="large"> <gallery id="gallery_Colors" getItemCount="GetColorGalleryCount" getItemImage="GetColorGalleryImage" getItemLabel="GetColorGalleryLabel" onAction="OnColorGallerySelect" columns="5" /> </menu> </splitButton>
对应的VBA回调示例:
' 返回Gallery的颜色选项总数 Sub GetColorGalleryCount(control As IRibbonControl, ByRef count) count = 10 ' 自定义颜色数量 End Sub ' 返回Gallery中每个颜色的预览图标 Sub GetColorGalleryImage(control As IRibbonControl, index As Integer, ByRef image) Dim colorArr As Variant colorArr = Array(RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255), RGB(255, 255, 0), RGB(255, 0, 255), _ RGB(0, 255, 255), RGB(128, 0, 0), RGB(0, 128, 0), RGB(0, 0, 128), RGB(128, 128, 0)) Set image = GenerateColorIcon(colorArr(index)) End Sub ' 返回Gallery中每个颜色的标签名称 Sub GetColorGalleryLabel(control As IRibbonControl, index As Integer, ByRef label) Dim colorNames As Variant colorNames = Array("红色", "绿色", "蓝色", "黄色", "洋红", "青色", "深红", "深绿", "深蓝", "深黄") label = colorNames(index) End Sub ' 主按钮点击事件:快速应用常用颜色 Sub OnQuickColorClick(control As IRibbonControl) ActiveCell.Font.Color = RGB(255, 0, 0) ' 替换为你的常用颜色 End Sub ' Gallery颜色选择事件 Sub OnColorGallerySelect(control As IRibbonControl, selectedId As String, selectedIndex As Integer) Dim colorArr As Variant colorArr = Array(RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255), RGB(255, 255, 0), RGB(255, 0, 255), _ RGB(0, 255, 255), RGB(128, 0, 0), RGB(0, 128, 0), RGB(0, 0, 128), RGB(128, 128, 0)) ActiveCell.Font.Color = colorArr(selectedIndex) End Sub ' 辅助函数:生成颜色预览图标 Function GenerateColorIcon(color As Long) As IPictureDisp Dim img As Object Set img = CreateObject("WIA.ImageFile") img.Initialize 16, 16 ' 设置图标尺寸 Dim pixel As Object For x = 1 To 16 For y = 1 To 16 Set pixel = img.Pixels(x, y) pixel.Red = (color And &HFF&) pixel.Green = (color And &HFF00&) \ &H100& pixel.Blue = (color And &HFF0000) \ &H10000 Next Next Set GenerateColorIcon = img.IPictureDisp End Function
方式2:用DynamicMenu替代普通Menu
如果觉得普通Menu的层级感仍有不便,可以用<dynamicMenu>通过回调直接渲染Gallery内容,展开SplitButton后直接显示颜色面板:
Ribbon XML代码:
<splitButton id="Splitbutton" size="normal"> <button id="btn_QuickColor" label="常用颜色" getImage="GetButtonImage" onAction="OnQuickColorClick" /> <dynamicMenu id="dynMenu_Colors" getContent="GetDynamicGalleryContent" itemSize="large" /> </splitButton>
对应的VBA回调:
Sub GetDynamicGalleryContent(control As IRibbonControl, ByRef content) ' 动态生成Gallery的XML结构 content = "<gallery id='gallery_DynColors' getItemCount='GetColorGalleryCount' getItemImage='GetColorGalleryImage' onAction='OnColorGallerySelect' columns='5' />" End Sub
其余回调函数和方式1一致。
关键注意点
- 放弃使用
SplitButtonGallery:该控件在Excel Ribbon中支持度有限,多数版本无法正常渲染,因此推荐SplitButton+Gallery的组合方案。 - 主按钮绑定常用颜色:直接解决你常用颜色操作繁琐的核心需求,无需进入Gallery选择。
- Gallery直接嵌入下拉容器:展开SplitButton后直接显示颜色选项,避免额外点击步骤。
内容的提问来源于stack exchange,提问作者Mos
相关产品推荐
相关产品推荐

