Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 354 355 356 357 358 359 360 361 362 ... 407
шаблон -- >

<Style x:Key="RoundButtonStyle" TargetType="Button">

  <Setter Property="Foreground" Value="Black"/>

  <Setter Property="FontSize" Value="14"/>

  <Setter Property="FontWeight" Value="Bold"/>

  <Setter Property="Width" Value="100"/>

  <Setter Property="Height" Value="100"/>

  <!-- Here is the template! -->

  <Setter Property="Template">

    <Setter.Value>

      <ControlTemplate TargetType="Button">

          <!-- Далее следует сам шаблон -->

      </ControlTemplate>

    </Setter.Value>

  </Setter>

</Style>

После такого обновления кнопочные элементы управления можно создавать с установкой свойства Style следующим образом:

<Button x:Name="myButton" Background="Red" Content="Howdy!"

    Click="myButton_Click" Style="{StaticResource RoundButtonStyle}"/>

Несмотря на то что внешний вид и поведение кнопки остаются такими же, преимущество внедрения шаблонов внутрь стилей связано с тем, что появляется возможность предоставить готовый набор значений для общих свойств. На этом обзор применения Visual Studio и инфраструктуры триггеров при построении специальных шаблонов для элемента управления завершен. Хотя об инфраструктуре WPF можно еще много чего сказать, теперь у вас имеется хороший фундамент для дальнейшего самостоятельного изучения.

Резюме

Первой в главе рассматривалась система управления ресурсами WPF. Мы начали с исследования работы с двоичными ресурсами и роли объектных ресурсов. Вы узнали, что объектные ресурсы представляют собой именованные фрагменты разметки XAML, которые могут быть сохранены в разнообразных местах с целью многократного использования содержимого.

Затем был описан API-интерфейс анимации WPF. В приведенных примерах анимация создавалась с помощью кода С#, а также посредством разметки XAML. Для управления выполнением анимации, определенной в разметке, применяются элементы Storyboard и триггеры. Далее был продемонстрирован механизм стилей WPF, который интенсивно использует графику, объектные ресурсы и анимацию.

После этого вы прояснили отношение между логическим и визуальным деревьями. В своей основе логическое дерево является однозначным соответствием разметке, которая создана для описания корневого элемента WPF. Позади логического дерева находится гораздо более глубокое визуальное дерево, содержащее детальные инструкции визуализации.

Кроме того, вы изучили роль стандартного шаблона. Не забывайте, что при построении специальных шаблонов вы по существу заменяете все визуальное дерево элемента управления (или часть дерева) собственной реализацией.

Глава 28

Уведомления WPF, проверка достоверности, команды и MWM

 В настоящей главе исследование программной модели WPF завершается рассмотрением возможностей, которые поддерживаются паттерном "модель-представление-модель представления" (Model View ViewModel — MWM). Вы также узнаете о системе уведомлений WPF и ее реализации паттерна "Наблюдатель" (Observer) через наблюдаемые модели и коллекции. Обеспечение автоматического отображения пользовательским интерфейсом текущего состояния данных значительно улучшает его восприятие конечными пользователями и сокращает объем ручного кодирования, требуемого для получения того же результата с помощью более старых технологий (вроде Windows Forms).

Во время разработки на основе паттерна "Наблюдатель" вы ознакомитесь с механизмами добавления проверки достоверности в свои приложения. Проверка достоверности — жизненно важная часть любого приложения, которая позволяет не только сообщать пользователю о том, что что-то пошло не так, но и указывать, в чем именно заключается проблема. Вы научитесь встраивать проверку достоверности в разметку представления для информирования пользователя о возникающих ошибках.

Затем вы более глубоко погрузитесь в систему команд WPF и создадите специальные команды для инкапсуляции программной логики почти так, как поступали в главе 25 со встроенными командами. С созданием специальных команд связано несколько преимуществ, включая (помимо прочего) возможность многократного использования кода, инкапсуляцию логики и разделение обязанностей.

Наконец, вы задействуете все это в примере приложения MWM.

Введение в паттерн MWM

Прежде чем приступить к детальному исследованию уведомлений, проверки достоверности и команд в WPF, было бы неплохо пролить свет на конечную цель настоящей главы, которой является паттерн "модель-представление-модель представления" (MWM). Будучи производным от паттерна проектирования "Модель представления" (Presentation Model) Мартина Фаулера, паттерн MWM задействует обсуждаемые в главе возможности, специфичные для XAML, чтобы сделать процесс разработки приложений WPF более быстрым и ясным. Само название паттерна отражает его основные компоненты: модель (Model), представление (View) и модель представления (ViewModel).

Модель

Модель — это объектное представление имеющихся данных. В паттерне MWM модели концептуально совпадают с моделями внутри нашего уровня доступа к данным (Data Access Layer — DAL). Иногда они являются теми же физическими классами, но поступать так вовсе не обязательно. По мере чтения главы вы узнаете, каким образом решать, применять ли модели DAL или же создавать новые модели.

Модели обычно используют в своих интересах встроенную (либо специальную) проверку достоверности через аннотации данных и интерфейс INotifyDataErrorInfo и сконфигурированы как наблюдаемые классы для связывания с системой уведомлений WPF. Все упомянутые темы рассматриваются позже в главе.

Представление

 Представление — это пользовательский интерфейс приложения, который спроектирован так, чтобы быть чрезвычайно легковесным. Вспомните о стенде меню в ресторане для автомобилистов. На стенде отображаются позиции меню и цены, а также имеется механизм взаимодействия клиента с внутренними системами. Однако в стенд не внедрены какие-либо интеллектуальные возможности, разве что он может быть снабжен специальной логикой пользовательского интерфейса, такой как включение освещения в темное время суток.

Представления MWM должны разрабатываться с учетом аналогичных целей. Любые интеллектуальные возможности необходимо встраивать в какие-то другие места приложения. Иметь прямое отношение к манипулированию пользовательским интерфейсом может только код в файле отделенного кода (например, в MainWindow.xaml.cs). Он не должен быть основан на бизнес-правилах или на чем-то еще, что нуждается в предохранении для будущего применения. Хотя это не является главной целью MWM, хорошо разработанные приложения MWM обычно имеют совсем небольшой объем отделенного кода.

Модель представления

В WPF и других технологиях XAML модель представления служит двум целям.

• Модель представления предлагает единственное местоположение для всех данных, необходимых представлению. Это вовсе не означает, что модель представления отвечает за получение действительных данных; взамен она является просто транспортным механизмом для перемещения данных из хранилища в представление. Обычно между представлениями и моделями представлений имеется отношение "один к одному", но существуют архитектурные отличия, которые в каждом конкретном случае могут варьироваться.

• Вторая цель модели представления касается ее действия в качестве контроллера для представления. Почти как стенд меню модель представления принимает указание от пользователя и передает их соответствующему коду для выполнения подходящих действий. Довольно часто такой код имеет форму специальных команд.

Анемичные модели или анемичные модели представлений

На заре развития WPF, когда разработчики все еще были в поиске лучшей реализации паттерна MWM, велись бурные (а временами

1 ... 354 355 356 357 358 359 360 361 362 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий