8

我为 Excel 2010 创建了一个自定义 Fluent Ribbon 界面,其中包括一个下拉菜单。相关 XML 代码(简化):

<dropDown id="chooseFilter" showLabel="true" label="Filter" onAction="filterSelected" > 
    <item id="Filter1" label="Filter 1" /> 
    <item id="Filter2" label="Filter 2" /> 
</dropDown>

加载功能区时,未选择任何值 - 下拉列表看起来是空的。

在此处输入图像描述

我希望默认选择第一项 - 但找不到任何描述如何执行此操作的文档。我查看了控件的MSDN 文档,但它没有涵盖这种情况。我尝试了“类 HTML”语句的各种排列,但它们都被自定义 UI 编辑器拒绝为无效。我尝试过的事情的例子:

<item id="Filter1" label="Filter 1" selected="selected" /> 

错误信息:The 'selected' attribute is not declared

我在声明中尝试了其他属性,如selectedItem,valueselected<dropDown .../>但似乎没有任何效果。

如果我有正确的文档,这将是微不足道的,但即使是用于功能区自定义的完整 Microsoft“文档”(在此处找到)对这个主题保持沉默。

我什至试图查看位于http://schemas.microsoft.com/office/2006/01/customui的架构是否是“人类可读的”,但是当我尝试在浏览器中打开它时,我被告知它是不可用。或许有什么诀窍...

所以我求助于这个论坛的综合智慧。从我的 Q/A 比率可以看出,我不经常这样做......

如何修改我的 XML 以使功能区打开时在下拉控件中选择任意项目?我会满足于它作为第一项 - 但“我选择在我的 XML 中声明的任何项目”会更可取。

我正在为此寻找 XML 解决方案 - 不希望添加onLoadVBA 代码或其他 VBA 技巧。有多难,对吧?...

4

3 回答 3

10

看起来您需要使用 VBA 才能选择默认项目。

引用dropDown 元素的文档(我的重点):

getSelectedItemID(getSelectedItemID 回调)

指定要调用的回调函数的名称,以确定要在此控件中选择的项的标识符。getSelectedItemID 和 getSelectedItemIndex 属性是互斥的。如果两个属性都没有指定,控件不应该显示一个选定的项目。例如,考虑以下 XML 片段:

<gallery id="gallery" getItemCount="GetGalleryItemCount"  
   getItemID="GetItemID"
   getSelectedItemID="GetGallerySelectedItemID" />

在此示例中,当应用程序需要确定图库中的选定项目时,调用 GetGallerySelectedItemID 回调函数。在此示例中,回调函数返回 GetItemID 回调函数返回的标识符之一。此属性的可能值由 ST_Delegate 简单类型定义,如第 2.3.2 节中所述。

根据我对文档的阅读,您应该自己维护当前选定的过滤器项目。GetSelectedItemID 处理程序将返回当前选定的项目,而 OnAction 处理程序将更新它。

在 XML 中:

<dropDown id="chooseFilter" showLabel="true" label="Filter"
   getSelectedItemID="GetSelectedItemID" onAction="OnAction"> 
   <item id="Filter1" label="Filter 1" /> 
   <item id="Filter2" label="Filter 2" />
</dropDown>

在工作簿的代码模块中:

Private mCurrentItemID As Variant

Sub GetSelectedItemID(control As IRibbonControl, ByRef itemID As Variant)
    If IsEmpty(mCurrentItemID) Then
        mCurrentItemID = "Filter1"
    End If
    itemID = mCurrentItemID
End Sub

Sub OnAction(control As IRibbonControl, selectedID As String, _
             selectedIndex As Integer)
    mCurrentItemID = selectedID
End Sub
于 2013-09-20T01:15:07.733 回答
5

我在启动时的空白下拉菜单中遇到了类似的问题,因为尚未设置任何内容。但是,当控件无效但下拉菜单已填充时,它将再次返回空白选择(我使控件无效,因为我向列表中添加了一些新项目,所以我希望重建它)。

正如这里所提到的,解决方案是使用
<dropDown id="ddc0" label="Label Dropdown 0" getSelectedItemIndex="GetSelectedItemIndexDropDown ...所提到的。

然后 VBA 回调:

Sub GetSelectedItemIndexDropDown(control As IRibbonControl, ByRef index) ' Callbackname in XML File "GetSelectedItemIndexDropDown ...

按预期工作。注意:onAction= "onActionCallback"用于设置状态并将其广播给 VBA 中的任何人;用于getSelectedItemIndex= "onGetSelectedItemIndexCallback"功能区查询它应该显示的状态。

于 2014-11-01T22:50:22.330 回答
3

我无耻地欺骗了这个 XML - 我使用了 RibbonCreator 2010

DefaultValue似乎设置在dropDown所有tag荒谬的地方......

<dropDown id="ddc0" label="Label Dropdown 0" getSelectedItemIndex="GetSelectedItemIndexDropDown" onAction="OnActionDropDown" getVisible="GetVisible" getEnabled="GetEnabled" tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;DefaultValue:=1;CustomPicture:=;CustomPicturePath:=">
    <item id="ddc0Item0" label="a" screentip="a" supertip="a"/>
    <item id="ddc0Item1" label="b" screentip="b" supertip="b"/>
</dropDown>

编辑:

除非您将以下函数添加到您的 VBA 代码中,否则这将不起作用:

Sub GetSelectedItemIndexDropDown(control As IRibbonControl, ByRef index)
    ' Callbackname in XML File "GetSelectedItemIndexDropDown"
    ' Callback getSelectedItemIndex
    Dim varIndex As Variant
    varIndex = getTheValue(control.Tag, "DefaultValue")
    If IsNumeric(varIndex) Then
        Select Case control.ID
            ''GetSelectedItemIndexDropDown''
            Case Else
                index = getTheValue(control.Tag, "DefaultValue")
        End Select
    End If
End Sub

Public Function getTheValue(strTag As String, strValue As String) As String
   Dim workTb()     As String
   Dim Ele()        As String
   Dim myVariabs()  As String
   Dim i            As Integer
   On Error Resume Next
      workTb = Split(strTag, ";")
      ReDim myVariabs(LBound(workTb) To UBound(workTb), 0 To 1)
      For i = LBound(workTb) To UBound(workTb)
         Ele = Split(workTb(i), ":=")
         myVariabs(i, 0) = Ele(0)
         If UBound(Ele) = 1 Then
            myVariabs(i, 1) = Ele(1)
         End If
      Next
      For i = LBound(myVariabs) To UBound(myVariabs)
         If strValue = myVariabs(i, 0) Then
            getTheValue = myVariabs(i, 1)
         End If
      Next
End Function

但是,它可以足够通用,一旦到位,就可以在 XML 中重复引用。

于 2013-09-20T01:04:02.293 回答