I've created similar in the past. The best option is to use a Autodesk.Revit.UI.ComboBox and then add event handers for:
CurrentChanged
DropDownOpened
DropDownClosed
The CurrentChanged event args have members for 'NewValue' and 'OldValue'
Step 1: during OnStartup of IExternalApplication read your XML into a dictionary of string, string (your key is the text displayed on the ComboBox item and the dictionary item value is the link).
Step 2: when CurrentChanged occurs your read the value of the NewValue (ComboBoxMember.ItemText) and find the link related to this in the dictionary created in Step 1.
Step 3: is simply to retrieve link from dictionary and open it.
The UI name space contains more than just split buttons and push buttons.
A more exotic approach using class inheritance is given below. With this you also have to decide how many items you will have as a maximum (for the example below it is ten).
Another idea is based on the fact the current journal location can be found from within an IExternalCommand and all command actions are recorded in a journal. However I'm not sure if the sequence involved (journal entries made vs read) would always capture this correctly. You also don't want to parse a large journal file to read a single entry.
Imports Autodesk.Revit.DB
Imports Autodesk.Revit.UI
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EntryClass
Implements IExternalApplication
Public Shared LinkDictionary As New Dictionary(Of String, String)
Public Function OnStartup(application As UIControlledApplication) As Result Implements IExternalApplication.OnStartup
Dim SampleList As String(,) = New String(2, 1) _
{{"www.google.com", "Google"},
{"www.autodesk.com", "AutoDesk"},
{"https://en.wikipedia.org/wiki/Main_Page", "Wikipedia"}}
'Above list would come from elsewhere
Dim TxStr As String = Me.GetType.Name
Dim RP As List(Of RibbonPanel) = application.GetRibbonPanels(Tab.AddIns)
Dim RPi As RibbonPanel = RP.Find(Function(j) j.Name = "Test")
If RPi Is Nothing Then
RPi = application.CreateRibbonPanel(Tab.AddIns, "Test")
End If
Dim PDBd As New PulldownButtonData("RPT_Test_PDB", "Links")
Dim PDB As PulldownButton = RPi.AddItem(PDBd)
For i = 0 To SampleList.GetUpperBound(0)
If i > 10 Then Exit For Else
'For this example can have a maximum of ten items
Dim TPlus As String = "RPT_RvtTests.EP" & CStr(i)
If LinkDictionary.ContainsKey(TPlus) Then Continue For Else
LinkDictionary.Add(TPlus, SampleList(i, 0))
Dim PBd As New PushButtonData("RPT_Test_PB_EP" & CStr(i), SampleList(i, 1), MyAssemblyPath, TPlus)
PDB.AddPushButton(PBd)
Next
Return Result.Succeeded
End Function
Private Shared Function MyAssemblyPath(Optional FileName As String = "") As String
Dim ASBPath As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly _
.GetExecutingAssembly().GetName.CodeBase)
ASBPath = Strings.Replace(ASBPath, "file:\", "")
Dim ASBName As String = System.IO.Path.GetFileName(System.Reflection.Assembly _
.GetExecutingAssembly().GetName.CodeBase)
Dim out As String = ASBPath & "\" & ASBName ' & ".dll"
Return out
End Function
Public Function OnShutdown(application As UIControlledApplication) As Result Implements IExternalApplication.OnShutdown
Return Result.Succeeded
End Function
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EntryPoint_Base
Implements IExternalCommand
Public ReadOnly Property Typ As String = "RPT_RvtTests." & Me.GetType.Name
Public Function Execute(commandData As ExternalCommandData, ByRef message As String, elements As ElementSet) As Result Implements IExternalCommand.Execute
If EntryClass.LinkDictionary.ContainsKey(Typ) Then
TaskDialog.Show("Empty", EntryClass.LinkDictionary(Typ))
End If
Return Result.Succeeded
End Function
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP0
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP1
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP2
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP3
Inherits EntryPoint_Base
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP4
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP5
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP6
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP7
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP8
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP9
Inherits EntryPoint_Base
Implements IExternalCommand
End Class
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)>
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)>
Public Class EP10
Inherits EntryPoint_Base
Implements IExternalCommand
End Class