Всем привет! Сегодня научимся создавать новые панели по типу Свойств или обозревателя проекта. Тема статьи — только регистрация панели, поэтому мы создадим простую панель для вывода сообщения, без функционала.
Если вы захотите сделать панель с кнопками, с которой можно менять модель, то вам нужно будет или подождать второй части этой статьи, или применить информацию из статей про немодальные окна. Запуск команд с панели работает также, как и с немодальных окон.
Введение
Чтобы создать панель и управлять её видимостью, нам нужно минимально создать 4 класса:
- Application, где мы зарегистрируем панель и добавим команду для управления видимостью
- Command, которая будет включать-выключать отображение панели
- Page (не Window), где будет хранится собственно отображение страницы
DockablePaneProvider мы реализуем обобщённый, чтобы он позволял управлять любыми панелями.
Page
Создадим простейшую страницу в стиле Hello world!:
Тут думаю всё понятно, если не понятно, читайте мою подборку про WPF.
Command
Создадим команду, которая будет менять видимость нашей панели:
DockablePaneId должен совпадать с тем, что будет при регистрации панели. Его можно вынести в отдельный класс.
DockablePaneProvider
А теперь самое интересное и сложное. Создадим класс для регистрации панели:
В чём тут суть:
Интерфейс IDockablePaneProvider имеет один метод SetupDockablePane. Он принимает DockablePaneProviderData, но при этом не вызывается непосредственно — мы передаём наш DockablePaneProvider при регистрации панели, при этом саму DockablePaneProviderData мы при регистрации передавать не обязаны. Какой будет наша панель — зависит от того, как будет модифицирована переменная data в методе SetupDockablePane. Поэтому я применил такой финт: я добавил DockablePaneProviderData как параметр конструктора, а в методе SetupDockablePane просто переношу значения свойств.
Application
Давайте по порядку, что теперь будет происходить при запуске Revit:
- Вызовется приватный метод SetupDockablePane внутри моего класса Application
- Внутри него мы создаём экземпляр DockablePaneProviderData, куда передаём в качестве FrameworkElement нашу страницу.
- Этому методу мы передаём dockablePaneId, заголовок нашей панели и написанный нами DockablePaneProvider.
- Провайдер получает при создании указанную нами DockablePaneProviderData.
- Далее Revit вызывает SetupDockablePane из провайдера, его переменная data получает наши значения, и мы видим нашу панель
Также в коде я создаю панель на ленте для кнопки, но тут уже нет ничего нового:
Заключение
Выполняем сборку, добавляем addin-файл и смотрим результат:
У нас получилось создать пользовательскую панель в Revit!
Итоговый код в моём репозитории на Github
Не забывайте подписываться на мой телеграм-канал о Revit API и до новых встреч!