Общие сведения об XAML

XAML (язык разметки расширяемых приложений) — это декларативный язык разметки, используемый для определения пользовательского интерфейса в приложениях WinUI. Вы описываете структуру и свойства пользовательского интерфейса в файлах .xaml, а логику и события обрабатываете в связанном файле кода программной части.

Что такое XAML?

XAML — это язык на основе XML для создания объектов и настройки их свойств. Вы объявляете элементы пользовательского интерфейса — кнопки, текстовые поля, макеты— в разметке и используете файл кода для реагирования на события и управления этими элементами во время выполнения.

Поскольку XAML — это текстовый формат обмена, дизайнеры и разработчики могут работать независимо: дизайнеры задают визуальную структуру в XAML, разработчики реализуют логику в code-behind, и обе стороны могут итеративно вносить изменения, не мешая друг другу.

Базовый синтаксис XAML

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

Полные сведения о синтаксисе см. в руководстве по синтаксису XAML.

XAML и Visual Studio

Редактор XAML в Visual Studio поддерживает IntelliSense, автодополнение и визуальный конструктор. Ошибки отображаются прямо в коде в виде волнистых подчёркиваний ещё до компиляции. Вам не нужно запоминать все правила синтаксиса — пусть IDE подсказывает вам.

Пространства имен XAML

Каждый XAML-файл объявляет пространства имен в корневом элементе. Типичная страница WinUI начинается с двух:

<Page
    x:Class="Application1.BlankPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  • Пространство имен по умолчанию (xmlns=): содержит все встроенные элементы управления WinUI, текст, графику, привязку данных и типы стилей. Большая часть XAML использует это пространство имен без префикса.
  • Пространство имен языка XAML (xmlns:x=): сопоставлено с x: префиксом, предоставляет основные функции языка.

Пространство имён x:

Свойство Purpose
x:Key Уникальный ключ для ресурса в ResourceDictionary
x:Class Связывает XAML-файл с его классом code-behind
x:Name Задает имя во время выполнения, чтобы связанный код мог ссылаться на элемент
x:Uid Помечает элементы для подстановки локализованных ресурсов
Встроенные типы XAML Выражение простых значений (например x:Boolean) в виде элементов объекта

Сопоставление пользовательских типов

Чтобы использовать собственные типы или сторонние типы библиотек в XAML, объявите префикс пространства имен, который сопоставляется с пространством имен кода:

xmlns:myTypes="using:myCompany.myTypes"

Затем ссылайте эти типы с префиксом:

<myTypes:CustomButton/>

Дополнительные сведения, включая рекомендации по C++/CX, см. в разделе "Пространства имен XAML" и сопоставления пространств имен.

Пространства имен конструктора и совместимости

Часто можно увидеть префиксы d: (конструктор) и mc: (совместимость разметки) в XAML, созданном средствами. Они предназначены для инструментов, используемых на этапе разработки, и их можно безопасно игнорировать во время выполнения. Дополнительные сведения см. в разделе "Другие пространства имен XAML".

Расширения разметки

Расширения разметки позволяют задать для свойства то, что не может быть выражено как обычная строка, например ссылка на общий ресурс или привязку данных. Они используют синтаксис фигурных скобок:

<Button Style="{StaticResource SearchButtonStyle}"/>

Без {StaticResource} вам пришлось бы использовать многословный синтаксис элемента свойства, чтобы присвоить Style. Расширения разметки сохраняют краткость XAML.

среда выполнения Windows XAML поддерживает следующие расширения разметки:

Extension Purpose
{x:Bind} Привязка данных во время компиляции (оптимальная производительность)
{Привязка} Привязка данных во время выполнения
{StaticResource} Ссылка на запись по ключу ResourceDictionary
{ThemeResource} Например {StaticResource}, но обновляется при изменении темы приложения
{TemplateBinding} Привязка к свойству родительского шаблона элемента управления
{RelativeSource} Привязка относительно шаблонизированного родителя
{CustomResource} Расширенный поиск настраиваемых ресурсов
{x:Null} Явно задайте для значения NULL значение null

Расширения разметки можно вкладывать друг в друга; сначала вычисляется самое внутреннее расширение.

Events

Присоединение обработчиков событий в XAML путем указания события в качестве атрибута и имени метода обработчика в качестве его значения:

<Button Click="showUpdatesButton_Click">Show updates</Button>

Компилятор ожидает, что в файле code-behind будет метод, соответствующий правильной сигнатуре делегата:

private void showUpdatesButton_Click(object sender, RoutedEventArgs e)
{
    // your code
}
void showUpdatesButton_Click(Windows::Foundation::IInspectable const&, Microsoft::UI::Xaml::RoutedEventArgs const&);

Замечание

В C++/CX каждая страница XAML содержит два файла программной части: заголовок (.xaml.h) и реализацию (.xaml.cpp).

Дополнительные сведения см. в разделе "События и перенаправленные события".

Словари ресурсов

ResourceDictionary хранит повторно используемые объекты — кисти, стили, шаблоны, — идентифицируемые с помощью x:Key. Ресурсы могут жить в разделе ресурсов страницы или в отдельном .xaml файле. Полное объяснение см. в разделе ResourceDictionary и ссылки на ресурсы XAML.

XAML и XML

XAML — это надмножество XML, и вот что нужно знать:

  • С учетом регистра: имена элементов и атрибутов должны точно совпадать.
  • xml:lang: допустим в XAML, но соответствует поведению среды выполнения на уровне фреймворка, а не поведению синтаксического анализа.
  • Кодировка: поддерживаются только UTF-8 и UTF-16.

Области имен XAML

Имена, назначенные с помощью x:Name, должны быть уникальными в пределах своей области имен. Области имен особенно важны внутри шаблонов элементов управления, где имена ограничены областью шаблона, а не страницы. Дополнительные сведения см. в разделе Области имен XAML.

Советы по производительности

  • Определите часто используемые кисти в качестве ресурсов SolidColorBrush вместо повторения цветовых литералов.
  • Размещайте ресурсы, используемые на нескольких страницах, в Application.Resources; ресурсы, относящиеся только к конкретной странице, оставляйте на этой странице.
  • Удалите неиспользуемые ресурсы (ключи без {StaticResource} ссылок) перед доставкой.
  • Избегайте переопределения шаблонов элементов управления — стандартные шаблоны уже оптимизированы с точки зрения производительности загрузки.
  • Используйте Border и контейнеры макета вместо того, чтобы рисовать один и тот же пиксель несколько раз (избыточная отрисовка).
  • Используйте шаблоны элементов по умолчанию для ListView и GridView; их Presenter логика настраивается для больших списков.

Дополнительные рекомендации см. в статье "Оптимизация разметки XAML".

Отладка XAML

Вы не можете установить точки останова в файлах .xaml, но Visual Studio предлагает другие возможности:

  • На этапе разработки: волнистые подчёркивания и маркеры ошибок появляются прямо при вводе.
  • Среда выполнения: при ошибках синтаксического анализа возникает исключение XamlParseException (или аналогичное структурированное исключение в C++/CX) с указанием номера строки в файле XAML.

Сведения об обработке ошибок среды выполнения см. в разделе "Обработка исключений" для приложений WinUI в C# или Visual Basic. Сведения о запуске сеанса отладки см. в разделе "Запуск сеанса отладки".