Что такое xaml
Перейти к содержимому

Что такое xaml

  • автор:

Понимание XAML

Для кого эта статья: для людей, которые только начинают своё знакомство с технологиями использующими XAML. Чтобы не усложнять статью, я не касаюсь многих деталей вроде Markup Extensions, управления ресурсами и т.п. Прочитав данную статью, я надеюсь, вы сможете понять что происходит под капотом XAML парсера и более чётко представлять как из вашего текстового документа получается граф объектов в памяти, с различными свойствами.

XAML — это язык разметки, который появился вместе с первой версией WPF от Microsoft. Сейчас он также используется в Silverlight и Windows Phone 7 (сути тот же Silverlight). Таким образом, сейчас довольно много людей активно используют XAML. Однако для эффективной работы полезно будет понять концепции, которые стоят за я языком, чтобы отдельные конструкции не казались странными.

В первую очередь стоит провести маленькое лирическое отступление. Существует два основных вида языков программирования: императивные и декларативные.

Императивные языки — это всем известные языки программирования, вроде C, C++, C#, Pascal, Basic и множество других. Основная идея в том, что в императивном языке мы говорим, что нужно сделать. Но не говорим, что должно получиться (обычно это мы должны описать и проверить в unit-тестах).

Декларативные языки, в обратную сторону, позволяют нам описать состояние, которого мы хотим добиться, но не требуют (и обычно не дают) описать как прийти в это состояние. Примеры таких языков: XAML (да и вообще все основанные на иерархической разметке XML, HTML и т.п.), также SQL.

Итак в чём разница?

Допустим я хочу создать TextBox и задать ему в текст «Habr», на C# это будет выглядеть так:

var tb = new TextBox(); tb.Text = "Habr";

На XAML это будет выглядеть так:

Разница очевидна. В первом случае, я сказал:
1. Создать экземпляр класса TextBox и присвоить его переменной tb.
2. Присвоить свойству переменной tb.Text значение «Habr».

Во втором, я сказал, что хочу получить в итоге TextBox со значением «Habr» в тексте. А уже как это будет сделано меня не волнует, этим занимается XAML парсер. Такое длинное отступление важно, чтобы понять как работает парсер.

Итак, теперь более подробный пример, с объяснением работы парсера:

  • CustomPrefix — любой идентификатор легальный в XML, который вы будете использовать для обращения к своим объектам.
  • clr-namespace: — специальный префикс, который обозначает, что дальше пойдёт пространство имён .Net
  • WpfApplication1 — собственно ваше пространство имён.

После того как вы объявите ваше собственное пространство имён, вы можете создавать элементы из него:

Итак наш XAML заставляет парсер создать экземпляр класса WpfApplication1.UserControl1, потом парсер видит, что мы хотим, чтобы в свойстве Content нашего контрола находился TextBox, парсер и это сделает и так далее.

  Habr 
 Habr

Эта запись эквивалента пункту 2, потому что объект TextBox отмечен атрибутом

[ContentProperty("Text")]

Свойство TextBox.Background имеет тип Brush — это абстрактный класс, у которого есть несколько конкретных реализаций, например SolidColorBrush, LinerGradientBrush и другие. Так как же наша строка «Red» превращается в подкласс Brush? За это отвечает конвертер. Чтобы указать какой конвертер применить для определённого типа на тип устанавливается TypeConverterAttribute. Для многих встроенных типов уже есть конвертеры, в том числе как в нашем примере, есть конвертер из строки в Brush, который создаёт экземляр SolidColorBrush и задаёт ему цвет указанный в строке.
Что делать, если вы хотите установить значение свойству не поддерживаемому стандартным конвертером или просто провести какую-то операцию над значением перед установкой? — Использовать собственный конвертер. Для этого достаточно реализовать интерфейс IValueConverter, в нём записать все необходимые манипуляции, а потом использовать конвертер в XAML следующим образом:

Конечно данный пример выглядит несколько странно, но чаще всего данные берутся из объектов бизнес-логики, тогда всё встанет на свои места.
И конечно, чтобы пример сработал, перед использованием конвертер нужно добавить в ресурсы, например так:

Чтобы не захламлять статью, я не буду тут подробнее рассказывать о ресурсах, лучше почитать другие статьи или примеры.

2. Второй вариант как можно задать свойству значение в виде сложного объекта: использовать объектный синтаксис:

Тут всё уже должно быть ясно. Создаём отдельный тэг для свойства объекта TextBox, а в нём создаём экземпляр SolidColorBrush или любого другого подтипа Brush с нужными нам параметрами.

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

UPD Обновил часть про конвертеры благодаря комментариям afsherman.

  • .NET
  • Разработка под Windows Phone

XAML

XAML (eXtensible Application Markup Language) — язык разметки, используемый для инициализации объектов в технологиях на платформе .NET. Применительно к WPF (а также к Silverlight) данный язык используется прежде всего для создания пользовательского интерфейса декларативным путем. Хотя функциональность XAML только графическими интерфейсами не ограничивается: данный язык также используется в технологиях WCF и WF, где он никак не связан с графическим интерфейсом. То есть его область шире. Применительно к WPF мы будем говорить о нем чаще всего именно как о языке разметки, который позволяет создавать декларативным путем интерфейс, наподобие HTML в веб-программировании. Однако опять же повторюсь, сводить XAML к одному интерфейсу было бы неправильно, и далее на примерах мы это увидим.

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

  • Возможность отделить графический интерфейс от логики приложения, благодаря чему над разными частями приложения могут относительно автономно работать разные специалисты: над интерфейсом — дизайнеры, над кодом логики — программисты.
  • Компактность, понятность, код на XAML относительно легко поддерживать.

При компиляции приложения в Visual Studio код в xaml-файлах также компилируется в бинарное представление кода xaml, которое называется BAML (Binary Application Markup Language). И затем код baml встраивается в финальную сборку приложения — exe или dll-файл.

Структура и пространства имен XAML

При создании нового проекта WPF он уже содержит файлы с кодом xaml. Так, создаваемый по умолчанию в проекте файл MainWindow.xaml будет иметь следующую разметку:

Если вы совершенно не знакомы с xaml и с xml, то даже этот небольшой минимальный код окна может вызывать затруднения.

Подобно структуре веб-страничке на html, здесь есть некоторая иерархия элементов. Элементов верхнего уровня является Window , который представляет собой окно приложения. При создании других окон в приложении нам придется всегда начинать объявление интерфейса с элемента Window, поскольку это элемент самого верхнего уровня.

Кроме Window существует еще два элемента верхнего уровня:

Элемент Window имеет вложенный пустой элемент Grid , а также подобно html-элементам ряд атрибутов (Title, Width, Height) — они задают заголовок, ширину и высоту окна соответственно.

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

При создании кода на языке C#, чтобы нам были доступны определенные классы, мы подключаем пространства имен с помощью директивы using , например, using System.Windows; .

Чтобы задействовать элементы в XAML, мы также подключаем пространства имен. Вторая и третья строчки как раз и представляют собой пространства имен, подключаемые в проект по умолчанию. А атрибут xmlns представляет специальный атрибут для определения пространства имен в XML.

Так, пространство имен http://schemas.microsoft.com/winfx/2006/xaml/presentation содержит описание и определение большинства элементов управления. Так как является пространством имен по умолчанию, то объявляется без всяких префиксов.

http://schemas.microsoft.com/winfx/2006/xaml — это пространство имен, которое определяет некоторые свойства XAML, например свойство Name или Key. Используемый префикс x в определении xmlns:x означает, что те свойства элементов, которые заключены в этом пространстве имен, будут использоваться с префиксом x — x:Name или x:Key . Это же пространство имен используется уже в первой строчке x:Class=»XamlApp.MainWindow» — здесь создается новый класс MainWindow и соответствующий ему файл кода, куда будет прописываться логика для данного окна приложения.

Это два основных пространства имен. Рассмотрим остальные:

  • xmlns:d=»http://schemas.microsoft.com/expression/blend/2008″ : предоставляет поддержку атрибутов в режиме дизайнера. Это пространство имен преимущественно предназначено для другого инструмента по созданию дизайна на XAML — Microsoft Expression Blend
  • xmlns:mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″ : обеспечивает режим совместимости разметок XAML. В определении объекта Window двумя строчками ниже можно найти его применение:

mc:Ignorable="d"

Важно понимать, что эти пространства имен не эквивалентны тем пространствам имен, которые подключаются при помощи директивы using в c#. Так, например, http://schemas.microsoft.com/winfx/2006/xaml/presentation подключает в проект следующие пространства имен:

  • System.Windows
  • System.Windows.Automation
  • System.Windows.Controls
  • System.Windows.Controls.Primitives
  • System.Windows.Data
  • System.Windows.Documents
  • System.Windows.Forms.Integration
  • System.Windows.Ink
  • System.Windows.Input
  • System.Windows.Media
  • System.Windows.Media.Animation
  • System.Windows.Media.Effects
  • System.Windows.Media.Imaging
  • System.Windows.Media.Media3D
  • System.Windows.Media.TextFormatting
  • System.Windows.Navigation
  • System.Windows.Shapes
  • System.Windows.Shell

Элементы и их атрибуты

XAML предлагает очень простую и ясную схему определения различных элементов и их свойств. Каждый элемент, как и любой элемент XML, должен иметь открытый и закрытый тег, как в случае с элементом Window:

Либо элемент может иметь сокращенню форму с закрывающим слешем в конце, наподобие:

Но в отличие от элементов xml каждый элемент в XAML соответствует определенному классу C#. Например, элемент Button соответствует классу System.Windows.Controls.Button . А свойства этого класса соответствуют атрибутам элемента Button.

Например, добавим кнопку в создаваемую по умолчанию разметку окна:

Сначала идет элемент самого высшего уровня — Window, затем идет вложенный элемент Grid — контейнер для других элементов, и в нем уже определен элемент Button, представляющий кнопку.

Для кнопки мы можем определить свойства в виде атрибутов. Здесь определены атрибуты x:Name (имя кнопки), Width , Height и Content . Причем, атрибут x:Name берется в данном случае из пространства имен «http://schemas.microsoft.com/winfx/2006/xaml», которое сопоставляется с префиксом x . А остальные атрибуты не используют префиксы, поэтому берутся из основного пространства имен «http://schemas.microsoft.com/winfx/2006/xaml/presentation».

Подобным образом мы можем определить и другие атрибуты, которые нам нужны. Либо мы в общем можем не определять атрибуты, и тогда они будут использовать значения по умолчанию.

Определив разметку xaml, мы можем запустить проект, и нам отобразится графически весь код xaml — то есть наша кнопка:

XAML в WPF

Специальные символы

При определении интерфейса в XAML мы можем столкнуться с некоторыми ограничениями. В частости, мы не можем использовать специальные символы, такие как знак амперсанда & , кавычки » и угловые скобки < и >. Например, мы хотим, чтобы текст кнопки был следующим: . У кнопки есть свойство Content , которое задает содержимое кнопки. И можно предположить, что нам надо написать так:

Но такой вариант ошибочен и даже не скомпилирутся. В этом случае нам надо использовать специальные коды символов:

Символ Код
<
> >
& &
« "

Еще одна проблема, с которой мы можем столкнуться в XAML — добавление пробелов. Возьмем, к примеру, следующее определение кнопки:

  

Здесь свойство Content задается неявно в виде содержимого между тегами . Но несмотря на то, что у нас несколько пробелов между словами «Hello» и «World», XAML по умолчанию будет убирать все эти пробелы. И чтобы сохранить пробелы, нам надо использовать атрибут xml:space=»preserve» :

  

Что такое XAML?

XAML (eXtensible Application Markup Language), что в переводе значит «Расширяемый Язык Разметки для Приложений», это вариант языка XML от Microsoft, описывающий GUI. В предыдущих итерациях фреймворков для GUI, например в WinForms, интерфейс пользователя создавался на том же языке, на котором Вы взаимодействовали с ним (например C#/VB.NET) и, обычно поддерживался средой разработки (например Visual Studio), но начиная с XAML Microsoft сменила вектор развития. Данный язык очень похож на HTML, и его помощью становится возможным легко разрабатывать и редактировать Ваш графический интерфейс.

Все это нельзя назвать полноценным руководством по языку разметки XAML, но я постараюсь кратко рассказать Вам, как им пользоваться, поскольку он является важной частью системы WPF. Независимо от того, что вы создаете: Окно или Страницу – они будут состоять из XAML документа и кода программной части (CodeBehind file), которые совместно создают Окно/Страницу. Файл XAML описывает интерфейс пользователя со всеми его элементами управления, тогда как CodeBehind обрабатывает все события и имеет доступ к управлению элементами XAML.

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

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Что такое xaml

What’s on this Page

.XAML вариант №

XAML, Extensible Application Markup Language, файлы расширений описывают элементы пользовательского интерфейса для программных приложений, основанных на Windows Presentation Foundation (WPF). Хотя это язык, его не нужно программировать, поскольку он основан на стандартном формате XML, который прост в использовании и понимании. XAML (произносится как «zammel») был разработан Microsoft специально для создания пользовательских интерфейсов. Первоначально его аббревиатура расшифровывалась как Extensible Avalon Markup Language, где Avalon было кодовым названием WPF. Файлы XAML иногда также сохраняются с расширением XOML.

XAML-приложения

XAML можно использовать в технологиях .NET Framework 3.0 и .NET Framework 4.0, таких как WPF, Silverlight, Windows Workflow Foundation (WF) и некоторых других. Элементы пользовательского интерфейса, привязки данных, события и другие функции определяются формами XAML в WPF. Точно так же рабочие процессы в WF можно определить с помощью XAML. Он легко обрабатывается инструментами по той причине, что основан на XML. Поскольку это декларативный язык и не требует компиляции, появляется множество продуктов, основанных на приложениях на основе XAML. Все, что создано или реализовано в XAML, может быть выражено с использованием более традиционного языка .NET, такого как C# или Visual Basic .NET.

Формат файла XAML

XAML полностью основан на формате XML. Первоначальные спецификации сопоставления объектов XAML были опубликованы в 2006 г., за которой последовала еще одна версия, опубликованная в 2009. Эти спецификации определяют две абстрактные информационные модели:

  • Модель информационного набора схемы XAML
  • Модель информационного набора XAML

Набор данных Xaml (сокращенно «Xaml Infoset») определяет структуру информации, которую может представлять экземпляр Xaml. Информационный набор схемы Xaml позволяет определять конкретные словари Xaml. Эта спецификация также определяет набор правил для преобразования XML-документа в информационный набор Xaml. XML — это распространенный формат для Xaml. (Термин «документ Xaml» относится к XML-документу, который представляет набор данных Xaml.) Но хотя в этой спецификации не определяются никакие другие представления, можно использовать любое физическое представление, если оно может представлять информацию в наборе данных Xaml. .

использованная литература

  • XAML — Википедия
  • Спецификации формата файла XAML

See Also

  • AN — файл проекта Adobe Edge Animate
  • APKG — формат файла колоды флеш-карт Anki
  • ASAX — файл серверного приложения ASP.NET
  • ASMX — файл веб-службы ASP.NET
  • ASP — формат файла страниц активного сервера

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *