Найти в Дзене

WPF-приложение для Revit. Часть 1. Создание окна

Оглавление

Всем привет! Сегодня начнём создавать WPF-приложения для Revit в Visual Studio с самого начала пошагово. В этой статье мы создадим окно на языке XAML и откроем его в Revit. В следующей части — наполним его внутренней логикой.

Перед стартом кратко распишу, что такое WPF, и в чём её преимущества? Я спросил у ChatGPT, и вот что он ответил:

Windows Presentation Foundation (WPF) - это технология разработки приложений для операционных систем Windows, предоставляющая богатые возможности для создания графических пользовательских интерфейсов (ГПИ). Вот пять ключевых аспектов WPF и её преимуществ:

  1. Декларативное описание интерфейса: WPF позволяет разработчикам описывать пользовательский интерфейс в виде XAML-кода (Extensible Application Markup Language), что делает его более понятным и управляемым.
  2. Гибкость дизайна: WPF поддерживает разнообразные стили, шаблоны и темы, что делает возможным создание креативных и стильных интерфейсов.
  3. Векторная графика: Одним из ключевых преимуществ WPF является поддержка векторной графики, что позволяет создавать скалируемые и высококачественные элементы интерфейса.
  4. Анимация: WPF предоставляет мощный инструментарий для создания анимаций, что позволяет сделать интерфейс более динамичным и привлекательным для пользователей.
  5. Многозадачность и многозадачность на уровне компонентов: WPF позволяет создавать многозадачные приложения, разделяя интерфейс и бизнес-логику, что улучшает общую производительность.

Задача

Создадим плагин-нумератор с возможностью добавления постоянного префикса. Пользователь выбирает элемент, появляется окно со следующими компонентами:

  • поле ввода префикса
  • поле ввода начального значения
  • выпадающий список всех параметров (выбранного элемента)
  • кнопки "Запуск" и "Отмена"

Пользователь выбирает параметр (обязательно), префикс же и начальное значение можно не вводить (по умолчанию — пустая строка и единица).

Создание проекта

Создадим новый проект также (инструкция), как и для создания обычного плагина или плагина на WinForms. Добавим все ссылки на Revit API и создадим класс для команды.

Важно: не нужно выбирать шаблон "Библиотека классов WPF", потому что будет создано приложение .NET 6 или 7. Эти версии .NET не совместимы с Revit, и плагин не запустится. Поэтому мы и идём обходным путём.

Добавим к проекту пользовательский элемент управления WPF:

Создаём элемент
Создаём элемент
Выбираем и переименовываем пользовательский элемент WPF
Выбираем и переименовываем пользовательский элемент WPF

Важно: Не стоит называть переменные и пространства имён также, как классы RevitAPI. Поэтому мы пишем MainView, а не View. Обычно основное окно называют по шаблону ProjectNameView

В проекте появилось 2 файла: MainView.xaml и MainView.xaml.cs. Зайдём во второй и внесём изменения:

-4

UserControl поменяем на Window.

Затем зайдём в MainView.xaml и в первой строке тоже заменим UserControl на Window:

<Window x:Class="WPFApplication.MainView"

Отлично! Теперь у нас есть проект .NET 4.8 с поддержкой WPF. Мы можем создавать окно в XAML-файле.

Создание окна

Язык XAML — язык гипертекстовой разметки окна. Он довольно сильно похож на HTML (в нём также есть дескрипторы, описываемые тегами <>), но есть и отличие.

Мы заполняем окно контейнерами компоновки, которые могут включать в себя другие контейнеры компоновки и пользовательские элементы управления (кнопки, выпадающие списки, переключатели и т.д). В данной статье я не ставлю цель рассказать про все элементы и все контейнеры, поэтому мы просто напишем код окна. Подробно о WPF можно почитать на https://metanit.com/sharp/wpf/. Я же буду рассматривать отдельные темы в следующих статьях.

Окно будет иметь следующий вид:

-5

Чтобы создать его, мы используем контейнеры компоновки 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. Но для начала нужно дописать код, который будет отображать окно. Разумеется, в нашем классе для команды:

Создаём окно и вызываем метод ShowDialog
Создаём окно и вызываем метод ShowDialog

Выполним сборку и запустим плагин через addin-manager. Результат:

-8

Итак, сегодня мы научились создавать WPF-проект для Revit и написали наше первое окно. Во второй части мы создадим класс ViewModel для нашего окна — наполним его внутренней логикой.

Подписывайтесь на мой телеграм-канал, пишите ваши мысли, идеи и результаты в комментарии и тут, и там. Не забывайте про подписку на Дзен и лайки под статьёй. До новых встреч!

-9