Всем привет! Сегодня начнём создавать WPF-приложения для Revit в Visual Studio с самого начала пошагово. В этой статье мы создадим окно на языке XAML и откроем его в Revit. В следующей части — наполним его внутренней логикой.
Перед стартом кратко распишу, что такое WPF, и в чём её преимущества? Я спросил у ChatGPT, и вот что он ответил:
Windows Presentation Foundation (WPF) - это технология разработки приложений для операционных систем Windows, предоставляющая богатые возможности для создания графических пользовательских интерфейсов (ГПИ). Вот пять ключевых аспектов WPF и её преимуществ:
- Декларативное описание интерфейса: WPF позволяет разработчикам описывать пользовательский интерфейс в виде XAML-кода (Extensible Application Markup Language), что делает его более понятным и управляемым.
- Гибкость дизайна: WPF поддерживает разнообразные стили, шаблоны и темы, что делает возможным создание креативных и стильных интерфейсов.
- Векторная графика: Одним из ключевых преимуществ WPF является поддержка векторной графики, что позволяет создавать скалируемые и высококачественные элементы интерфейса.
- Анимация: WPF предоставляет мощный инструментарий для создания анимаций, что позволяет сделать интерфейс более динамичным и привлекательным для пользователей.
- Многозадачность и многозадачность на уровне компонентов: WPF позволяет создавать многозадачные приложения, разделяя интерфейс и бизнес-логику, что улучшает общую производительность.
Задача
Создадим плагин-нумератор с возможностью добавления постоянного префикса. Пользователь выбирает элемент, появляется окно со следующими компонентами:
- поле ввода префикса
- поле ввода начального значения
- выпадающий список всех параметров (выбранного элемента)
- кнопки "Запуск" и "Отмена"
Пользователь выбирает параметр (обязательно), префикс же и начальное значение можно не вводить (по умолчанию — пустая строка и единица).
Создание проекта
Создадим новый проект также (инструкция), как и для создания обычного плагина или плагина на WinForms. Добавим все ссылки на Revit API и создадим класс для команды.
Важно: не нужно выбирать шаблон "Библиотека классов WPF", потому что будет создано приложение .NET 6 или 7. Эти версии .NET не совместимы с Revit, и плагин не запустится. Поэтому мы и идём обходным путём.
Добавим к проекту пользовательский элемент управления WPF:
Важно: Не стоит называть переменные и пространства имён также, как классы RevitAPI. Поэтому мы пишем MainView, а не View. Обычно основное окно называют по шаблону ProjectNameView
В проекте появилось 2 файла: MainView.xaml и MainView.xaml.cs. Зайдём во второй и внесём изменения:
UserControl поменяем на Window.
Затем зайдём в MainView.xaml и в первой строке тоже заменим UserControl на Window:
<Window x:Class="WPFApplication.MainView"
Отлично! Теперь у нас есть проект .NET 4.8 с поддержкой WPF. Мы можем создавать окно в XAML-файле.
Создание окна
Язык XAML — язык гипертекстовой разметки окна. Он довольно сильно похож на HTML (в нём также есть дескрипторы, описываемые тегами <>), но есть и отличие.
Мы заполняем окно контейнерами компоновки, которые могут включать в себя другие контейнеры компоновки и пользовательские элементы управления (кнопки, выпадающие списки, переключатели и т.д). В данной статье я не ставлю цель рассказать про все элементы и все контейнеры, поэтому мы просто напишем код окна. Подробно о WPF можно почитать на https://metanit.com/sharp/wpf/. Я же буду рассматривать отдельные темы в следующих статьях.
Окно будет иметь следующий вид:
Чтобы создать его, мы используем контейнеры компоновки StackPanel. Этот контейнер выставляет элементы подряд друг за другом либо по вертикали, либо по горизонтали. Взгляните на окно: там будет один главный вертикальный StackPanel (4 группы элементов в "строках") и 3 вложенных горизонтальных (первая, вторая и четвёртая строки).
Это вообще мой любимый контейнер, я его почти везде использую, возможно даже слишком много. Можно было бы создать такое же окно с помощью Grid с 4 строками и 2 столбцами, и выровнять поля для ввода по вертикали между собой.
Посмотрим XAML-код:
Итак, что мы сделали:
1. Заменили контейнер по умолчанию Grid на StackPanel. Далее добавили в него первый вложенный StackPanel (со свойством Orientation="Horizontal"), в него первые 2 элемента: TextBlock (подпись поля для ввода) и поле для ввода (TextBox) — строки 10-13.
2. Тоже самое на строках 14-17. Кстати, Margin - это отступ от края элемента до его соседей или контейнеров. Если их убрать, элементы "прижмутся друг к другу".
3. Добавили выпадающий список ComboBox шириной 160.
4. Ну и ещё один контейнер с 2 кнопками Button.
Рекомендую воспроизвести этот код самостоятельно, это будет несложно, потому что вам помогут всплывающие подсказки Intellisense. С их помощью вы сможете изучить и другие свойства элементов управления, и посмотреть, как они влияют на отображение.
Запуск окна в Revit
Запускать будем с помощью Addin-manager. Но для начала нужно дописать код, который будет отображать окно. Разумеется, в нашем классе для команды:
Выполним сборку и запустим плагин через addin-manager. Результат:
Итак, сегодня мы научились создавать WPF-проект для Revit и написали наше первое окно. Во второй части мы создадим класс ViewModel для нашего окна — наполним его внутренней логикой.
Подписывайтесь на мой телеграм-канал, пишите ваши мысли, идеи и результаты в комментарии и тут, и там. Не забывайте про подписку на Дзен и лайки под статьёй. До новых встреч!