Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Глава 24
Введение в Windows Presentation Foundation и XAML
Когда была выпущена версия 1.0 платформы .NET, программисты, нуждающиеся в построении графических настольных приложений, использовали два API-интерфейса под названиями Windows Forms и GDI+, упакованные преимущественно в сборках System.Windows.Forms.dll и System.Drawing.dll. Наряду с тем, что Windows Forms и GDI+ все еще являются жизнеспособными API-интерфейсами для построения традиционных настольных графических пользовательских интерфейсов, начиная с версии .NET 3.0, поставляется альтернативный API-интерфейс с таким же предназначением — Windows Presentation Foundation (WPF). В выпуске .NET Core 3.0 интерфейсы WPF и Windows Forms объединены с семейством .NET Core.
В начале этой вводной главы, посвященной WPF, вы ознакомитесь с мотивацией, лежащей в основе новой инфраструктуры для построения графических пользовательских интерфейсов, что поможет увидеть отличия между моделями программирования Windows Forms/GDI+ и WPF. Затем анализируется роль ряда важных классов, включая Application, Window, ContentControl, Control, UIElement и FrameworkElement.
В настоящей главе будет представлена грамматика на основе XML, которая называется расширяемым языком разметки приложений (Extensible Application Markup Language — XAML). Вы изучите синтаксис и семантику XAML (в том числе синтаксис присоединяемых свойств, роль преобразователей типов и расширений разметки).
Глава завершается исследованием визуальных конструкторов WPF, встроенных в Visual Studio, за счет построения вашего первого приложения WPF. Вы научитесь перехватывать действия клавиатуры и мыши, определять данные уровня приложения и выполнять другие распространенные задачи WPF.
Побудительные причины создания WPF
На протяжении многих лет в Microsoft создавали инструменты для построения графических пользовательских интерфейсов (для низкоуровневой разработки на C/C++/Windows API, VB6, MFC и т.д.) настольных приложений. Каждый инструмент предлагает кодовую базу для представления основных аспектов приложения с графическим пользовательским интерфейсом, включая главные окна, диалоговые окна, элементы управления, системы меню и другие базовые аспекты. После начального выпуска платформы .NET инфраструктура Windows Forms быстро стала предпочтительным подходом к разработке пользовательских интерфейсов благодаря своей простой, но очень мощной объектной модели.
Хотя с помощью Windows Forms было успешно создано множество полноценных настольных приложений, дело в том, что данная программная модель несколько ассиметрична. Попросту говоря, сборки System.Windows.Forms.dll и System.Drawing.dll не предоставляют прямую поддержку для многих дополнительных технологий, требуемых при построении полнофункционального настольного приложения. Чтобы проиллюстрировать сказанное, рассмотрим узкоспециализированную разработку графических пользовательских интерфейсов до выпуска WPF (табл. 24.1).
Как видите, разработчик, использующий Windows Forms, вынужден заимствовать типы из нескольких несвязанных API-интерфейсов и объектных моделей. Несмотря на то что применение всех разрозненных API-интерфейсов синтаксически похоже (в конце концов, это просто код С#), каждая технология требует радикально иного мышления. Например, навыки, необходимые для создания трехмерной анимации с использованием DirectX, совершенно отличаются от тех, что нужны для привязки данных к экранной сетке. Конечно, программисту Windows Forms чрезвычайно трудно в равной степени хорошо овладеть природой каждого API-интерфейса.
Унификация несходных API-интерфейсов
Инфраструктура WPF специально создавалась для объединения ранее несвязанных задач программирования в одну унифицированную объектную модель. Таким образом, при разработке трехмерной анимации больше не возникает необходимости в ручном кодировании с применением API-интерфейса DirectX (хотя это можно делать), поскольку нужная функциональность уже встроена в WPF. Чтобы продемонстрировать, насколько все стало яснее, в табл. 24.2 представлена модель разработки настольных приложений, введенная в .NET 3.0.
Очевидное преимущество здесь в том, что программисты приложений .NET теперь имеют единственный симметричный API-интерфейс для всех распространенных потребностей, появляющихся во время разработки графических пользовательских интерфейсов настольных приложений. Освоившись с функциональностью основных сборок WPF и грамматикой XAML, вы будете приятно удивлены, насколько быстро с их помощью можно создавать сложные пользовательские интерфейсы.
Обеспечение разделения обязанностей через XAML
Возможно, одно из наиболее значительных преимуществ заключается в том, что инфраструктура WPF предлагает способ аккуратного отделения внешнего вида и поведения приложения с графическим пользовательским интерфейсом от программной логики, которая им управляет. Используя язык XAML, пользовательский интерфейс приложения можно определять через разметку XML. Такая разметка (в идеале генерируемая с помощью инструментов вроде Microsoft Visual Studio или Blend для Visual Studio) затем может быть подключена к связанному файлу кода для обеспечения внутренней части функциональности программы.
На заметку! Применение языка XAML не ограничено приложениями WPF. Любое приложение может использовать XAML для описания дерева объектов .NET, даже если они не имеют никакого отношения к видимому пользовательскому интерфейсу.
По мере погружения в WPF вас может удивить, насколько высокую гибкость обеспечивает эта "настольная разметка". Язык XAML позволяет определять в разметке не только простые элементы пользовательского интерфейса (кнопки, таблицы, окна со списками и т.д.), но также интерактивную двумерную и трехмерную графику, анимацию, логику привязки данных и функциональность мультимедиа (наподобие воспроизведения видео).
Кроме того, XAML облегчает настройку визуализации элемента управления. Например, определение круглой кнопки, на которой выполняется анимация логотипа компании, требует всего нескольких строк разметки. Как показано в главе 27, элементы управления WPF могут быть модифицированы посредством стилей и шаблонов, которые позволяют изменять весь внешний вид приложения с минимальными усилиями. В отличие от разработки с помощью Windows Forms единственной веской причиной для построения специального элемента управления WPF с нуля является необходимость в изменении поведения элемента управления (например, добавление специальных методов, свойств или событий либо создание подкласса существующего элемента управления с целью переопределения виртуальных членов). Если нужно просто изменить внешний вид элемента управления (как в случае с круглой анимированной кнопкой), то это можно делать полностью через разметку.
Обеспечение оптимизированной модели визуализации
Наборы инструментов для построения графических пользовательских интерфейсов, такие как Windows Forms, MFC или VB6, выполняют все запросы графической визуализации (включая визуализацию элементов управления вроде кнопок и окон со списком) с применением низкоуровневого API-интерфейса на основе С (GDI), который в течение многих лет был частью Windows. Интерфейс GDI обеспечивает адекватную производительность для типовых бизнес-приложений или простых графических программ; однако если приложению с пользовательским интерфейсом нужна была высокопроизводительная графика, то приходилось обращаться к услугам DirectX.
Программная модель WPF полностью отличается тем, что при визуализации графических данных GDI не используется. Все операции визуализации (двумерная и трехмерная графика, анимация, визуализация элементов управления и т.д.) теперь работают с API-интерфейсом DirectX. Очевидная выгода такого подхода в том, что приложения WPF будут автоматически получать преимущества аппаратной и программной оптимизации. Вдобавок приложения WPF могут задействовать развитые графические службы (эффекты размытия, сглаживания, прозрачности и т.п.)