Всем привет! Сегодня расскажу, что можно разместить на пользовательской панели, чтобы создать там интересный интерфейс, а не просто скучный набор кнопок.
Для предыдущих статей я обычно брал информацию "из головы", но в этот раз мне потребовалось довольно сильно погрузится в материал, и поэкспериментировать с кодом, потому что раньше я умел лишь добавлять кнопки.
Рекомендую внимательно ознакомиться со статьёй про создание панелей и кнопок, прежде чем будете повторять то, что написано здесь, особенно с тем, что касается добавления изображений для кнопок в проект.
Пользовательские кнопки
В этой статье я рассматриваю информацию только из библиотеки RevitAPIUI и namespace Autodesk.Revit.UI. Это не единственный способ, можно модифицировать ленту Ревита с помощью библиотеки AdWindows, но об этом я расскажу в другой раз — там более обширная и сложная тема.
Какие бывают кнопки:
1. Обычная кнопка PushButton. Самая часто встречающаяся. Может быть сама по себе, а может быть частью выпадающего списка или сложена в стек из 2 или 3 кнопок.
2. PullDownButton — кнопка-выпадающий список. При нажатии на неё открывается список, и можно выбрать из нескольких вариантов. Список наполняется обычными PushButton.
3. SplitButton — почти тоже самое, что и PullDownButton, но с небольшой разницей. В PullDownButton при нажатии всегда раскрывается выпадающий список, а SplitButton состоит из 2 частей: выбранная кнопка и кнопка раскрытия списка. То есть мы можем сразу нажать на кнопку, а можем выбрать из списка другую: тогда выполнится другая команда, а кнопка по умолчанию заменится на последнюю вызванную.
3. RadioButtonGroup с кнопками-переключателями ToggleButton. Какие тут нюансы:
- ToggleButton нельзя добавить непосредственно на панель, только в составе RadioButtonGroup
- В составе RadioButtonGroup всегда одна кнопка нажатая, а остальные — нет. При нажатии новой кнопки она становится нажатой, а предыдущая переходит в обычное состояние
Все эти классы добавляются примерно одинаково: создаётся класс ButtonNameData, а затем на панели вызывается метод AddItem, куда и передаётся информация о новой кнопке. Метод возвращает саму кнопку, после чего её можно дополнительно модифицировать.
Добавление кнопок в приложении
Ссылка на GitHub со всем кодом будет в конце статьи.
Я добавил в своё приложение несколько изображений, чтобы панель выглядела поживее. Назначил им действия при сборке: Resource. Можете взять мои, а можете загуглить и скачать png-иконки или нарисовать самостоятельно.
1. Добавим ToggleButton:
Сначала добавили RadioButtonGroup, а затем в неё — ToggleButton. В кнопку-переключатель передаём ссылку на текущую сборку и имя нужной команды. Здесь я пишу только про оформление панели, так что команды почти везде будут одни и те же.
2. Добавим PullDownButton и SplitButton
SplitButton — это наследник PullDownButton, поэтому тут код мы немножко объединим:
Для обеих кнопок мы вызываем метод FillPullDown, который заполняют их кнопками PushButton. Для разнообразия я добавил в списке разделитель на строке 97.
3. Добавим маленькие кнопки StackedItems
Можно добавить 2 или 3 кнопки. Тут я немножко поиграл с циклами — подробно о них я писал тут.
4. Добавим кнопки на панель.
Мы написали методы на добавление кнопок, но важно не забыть вызвать эти методы в OnStartup() нашего приложения:
Здесь я, чуть забегая вперёд, уже добавил поле для ввода текста и выпадающий список, появляющиеся после нажатия стрелочки внизу панели
Собственно, по кнопкам всё. Давайте посмотрим результат на панели Ревита:
Выпадающий список и поле для ввода текста
Добавим ComboBox и TextBox, а также научимся получать из них информацию для других команд. Я добавлю их под свою панель, чтобы показать, что есть такая возможность. Для этого я вызываю на панели метод AddSlideOut(). Всё, что будет добавлено на панель после него, попадёт в выпадающий список под панелью.
ComboBox и TextBox создаётся по тем же принципам, что и кнопки. Отличие состоит в том, что у них есть события, с помощью которых можно отслеживать изменение выбора в них.
Создадим новую команду, которая будет выводить информацию из них, и добавим в ней статические свойства для хранения и перезаписи изменённого выбора:
А теперь определим ComboBox и TextBox в классе Application:
На строке 132 я изменяю значение свойства ComboBoxValue.
Тут данные мы получили на строке 145.
Команду HelloWorldCommand я назначил маленьким кнопкам, расположенным в стеке. Посмотрим результат:
У нас появился выпадающий список под панелью, список со значениями в нём и ТекстБокс для ввода, и мы передали информацию с них во внешнюю команду. Отличный результат!
Итоговый код в моём репозитории на GitHub.
Подписывайтесь на мой телеграм-канал и не забывайте ставить лайки под статьёй и звёздочки на репозитории. До новых встреч!