Спасибо, я это посмотрю. Хотя эта разметка выглядит как-то очень незнакомо. Как ее к коду прикручивать - совершенно непонятно. Может, со временем разберусь.
...
В целом процесс создания кнопок я стырил из доклада Mike Tuersley "Creating a Ribbon Bar for AutoCAD® with VB.NET". Оно работает, вопросов нет. И вообще примеров в Сети куча.
Но как-то хотелось бы знать, что этот код делает. Потому что просто из костылей все вязать - это как-то очень печально.
Вот кусок кода, который там приведен:
Imports System
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Windows
Imports Autodesk.Windows
Public Class Class1 Implements IExtensionApplication
Public Sub Initialize() Implements IExtensionApplication.Initialize
createRibbon()
End Sub
Public Sub Terminate() Implements IExtensionApplication.Terminate
End Sub
Private Sub CreateRibbon()
'declare a ribboncontrol object
Dim ribCntrl As RibbonControl = ComponentManager.Ribbon
'create a ribbontab
Dim ribTab As New RibbonTab()
'set a few properties
ribTab.Title = "AU2009"
ribTab.Id = "AU2009"
'add the tab to the ribbon
ribCntrl.Tabs.Add(ribTab)
'set as active tab
ribTab.IsActive = True
End Sub
End Class
Private Sub addContent(ByVal ribTab As RibbonTab)
'create the panel source
Dim ribSourcePanel As RibbonPanelSource = New RibbonPanelSource()
ribSourcePanel.Title = "Dev Tools"
'now the panel
Dim ribPanel As New RibbonPanel()
ribPanel.Source = ribSourcePanel
ribTab.Panels.Add(ribPanel)
'create a button
Dim ribButton1 As RibbonButton = New RibbonButton()
ribButton1.Text = "Net load"
ribButton1.CommandParameter = "NETLOAD "
ribButton1.ShowText = True
ribButton1.CommandHandler = New AdskCommandHandler()
'add the button
ribSourcePanel.Items.Add(ribButton1)
End Sub
Public Class AdskCommandHandler Implements System.Windows.Input.ICommand
Public Function CanExecute(ByVal parameter As Object) As Boolean _ Implements System.Windows.Input.ICommand.CanExecute
Return True
End Function
Public Event CanExecuteChanged As EventHandler Implements _ System.Windows.Input.ICommand.CanExecuteChanged
Public Sub Execute(ByVal parameter As Object) Implements _ System.Windows.Input.ICommand.Execute
Dim ribBtn As RibbonButton = TryCast(parameter, RibbonButton)
If ribBtn IsNot Nothing Then
Autodesk.AutoCAD.ApplicationServices.Application. DocumentManager.MdiActiveDocument. SendStringToExecute(_ ribBtn.CommandParameter, True, False, True)
End If
End Sub
End Class
Во-первых, откуда-то взялся класс IExtensionApplication. Видимо, именно благодаря ему можно использовать Initialize() и Terminate(). (Уже потом я наткнулся на запись в ивестном блоге
http://through-the-interface.typepad.com/through_the_interface/2006/09/initialization_.html).
Во-вторых, объявляются всяческие Ribbon и RibbonTab. То, что это лента и вкладка на ленте, понятно на интуитивном уровне. Пока неважно - все равно они не главную роль играют в коде.
Потом на сцену выступают RibbonPanelSource и RibbonPanel. Не знаю, не понимаю, в чем отличие. Это, похоже, тоже разработка Autodesk (по крайней мере, находится оно в Autodesk.Window namespace).
После всего этого в коде появляется КНОПКА RibbonButton. У нее используются параметры Text, CommandParameter (это, видимо, команда AutoCAD, которая запускается при нажатии кнопки), ShowText (булевская переменная, видимо, отвечающая за отображение текста) и CommandHandler (обработчик, который будет исполняться при нажатии кнопки).
Затем определяется этот самый обработчик, причем отдельным классом. Отдельным классом он определен, как я понимаю, потому, что он должен реализовывать интерфейс System.Windows.Input.ICommand. В рамках класса AdskCommandHandler определены: функция CanExecute(), событие CanExecuteChanged и функция Execute() (все это просто для реализации интерфейса ICommand - так, CanExecute() в этом примере всегда возвращает true, а событие CanExecuteChanged вроде бы нигде не используется).
В итоге я добавил кнопку (с картинкой, там дальше в примере это было) и в Execute() поместил логику. Работает.
При этом я понятия не имею, какие еще у кнопки есть методы (то есть поля и методы я могу просмотреть в IDE, но что они делают - черт их знает).
Аналогичная ситуация и со многими другими объектами. И что делать?