При разработке приложений UWP с помощью языка C# основной технологией для построения графического интерфейса является XAML (eXtensible Application Markup Language). XAML представляет язык разметки на основе XML, который используется для декларативного описания графического интерфейса.
XAML позволяет отделить определение интерфейса или внешнего вида приложения от его логики, которая пишется на C#. Кроме того, декларативное описание интерфейса делает код более компактным и понятным.
Если мы возьмем стандартный проект UWP по типу Blank Application , то как раз увидим файлы, которые используют XAML. Например, в проекте мы можем найти файл MainPage.xaml , который представляет декларативное описание графического интерфейса для единственной страницы в приложении:
Как и в любом документе XML здесь определяется иерархия элементов. Элементом самого верхнего уровня или корневым элементом является Page, который представляет собой отдельную страницу приложения. Фактически элемент Page представляет страницу с графическим интерфейсом, а отдельные элементы, из которых состоит интерфейс, например, кнопки, текстовые поля и т.д., добавляются внутрь элемента Page.
[XAM130] Why use XAML to define your UI?
Пространства имен XAML
xmlns_x=»http://schemas.microsoft.com/winfx/2006/xaml» xmlns_local=»using:XamlApp» xmlns_d=»http://schemas.microsoft.com/expression/blend/2008″ xmlns_mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″
Рассмотрим все эти пространства.
- Пространство имен http://schemas.microsoft.com/winfx/2006/xaml/presentation содержит определение большинства элементов управления, которые используются для построения интерфейса. Оно является пространством имен по умолчанию, поэтому оно определяется просто с помощью атрибута xmlns без всяких префиксов.
- Далее подключается пространство имен «http://schemas.microsoft.com/winfx/2006/xaml» . Оно определяет ряд атрибутов xaml таких, как Name или Key. Причем оно объявляется с помощью атрибута xmlns:x — префикс x после двоеточия означает, что те свойства элементов, которые содержатся в этом пространстве имен, будут использоваться с префиксом x. Например, x:Name или x:Key. Так, на второй строке идет следующее выражение: x_Class=»XamlApp.MainPage» . Атрибут Class указывает на класс C#, который будет соответствовать данному элементу Page. И так как этот атрибут используется с префиксом x, то соответственно определение атрибута Class будет извлекаться из пространства имен xmlns_x=»http://schemas.microsoft.com/winfx/2006/xaml»
- Третье подключаемое пространство имен xmlns_local=»using:XamlApp» представляет текущее пространств имен проекта, который в моем случае называется XamlApp. То есть, все определенные в проекте классы, можно будет использовать в XAML с префиксом local.
- Два последних пространства имен xmlns_d=»http://schemas.microsoft.com/expression/blend/2008″ и xmlns_mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″ используются преимущественно для визуализации дизайна страницы в окне дизайнера сверху. При запуске приложения они никак не используются и игнорируются, поэтому на следующей строке можно увидеть атрибут mc_Ignorable=»d» . Он указывает, что надо игнорировать пространство имен с префиксом d.
Элементы и их атрибуты
XAML предлагает довольно простую и ясную схему определения различных элементов и их свойств. Каждый элемент, как и любой элемент XML, должен иметь открытый и закрытый тег, как в случае с элементом Page:
[C# WPF] Основы XAML
Либо элемент может иметь сокращенню форму с закрывающим слешем в конце, наподобие:
Но в отличие от элементов обычного документа xml элементы в xaml соответствуют определенному классу из C#. Например, кнопка — элемент Button соответствует классу Windows.UI.Xaml.Controls.Button . А атрибуты элемента Button соответствуют свойствам класса Button.
Например, добавим на страницу кнопку:
Для кнопки мы можем определить свойства в виде атрибутов. Здесь определены атрибуты x:Name (имя кнопки), Width, Height, FontFamily (используемый шрифт) и Content. Причем, атрибут x:Name берется в данном случае из пространства имен http://schemas.microsoft.com/winfx/2006/xaml , которое сопоставляется с префиксом x. А остальные атрибуты не используют префиксы, поэтому берутся из основного пространства имен http://schemas.microsoft.com/winfx/2006/xaml/presentation . Из него же берется и сам элемент Button.
Также мы можем определить и другие атрибуты, которые нам нужны. Либо мы в общем можем не определять атрибуты, и тогда они будут использовать значения по умолчанию.
И мы можем запустить проект, и тогда на форме приложения появится добавленная нами кнопка:
Источник: metanit.com
Понимание 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
Источник: habr.com
Элементы xaml. Плюсы и минусы языка
XAML — это язык разметки, разработкой которого занималась компания Microsoft, и внедрен он был во время появления начальной версии WPF. Сегодня языком активно пользуются многие люди, поскольку он актуален в Silverlight, Windows Phone 7. Но, чтобы эффективно применять XAML, нужно знать и понимать основные положения его концепции. Выделяют несколько видов языков в программировании.
Основные два — это императивные и декларативные. К первому типу относятся такие популярные языки, как C, C++, C#, Pascal и прочие. Основная задумка заключается в том, что программист указывает, что нужно сделать. При этом не обозначается, что должно быть на выходе, этот момент, чаще всего, описывается и проверяется при тестировании. Второй тип является противоположностью.
В этом случае есть возможность описывать состояния, которые нам требуется получить в итоге, а описание того, как получить необходимое состояние, не нужно. На концепции основаны все языки иерархической разметки, в том числе XAML, управление базами данных SQL.
Для чего нужен Xaml?
Исходя из модели программирования .NET Core язык XAML создан для упрощения процесса реализации интерфейса пользователя (или UI — user interface) для программ .NET Core. Видимые элементы UI можно создавать в декларативной разметке, то есть, используя Xaml, а далее отделить значение пользовательского интерфейса от логики времени осуществления.
Для этого используются файлы кода, которые добавляют к разметке посредством определений разделяемых классов. Экземпляры объектов в конкретных сборках создаются напрямую. В этом лежит главное отличие от большинства остальных языков разметки, что зачастую являются интерпретируемыми и не имеют связи напрямую с системой вспомогательных типов.
Таким образом, обеспечивается рабочий процесс, в ходе которого, несколько участников могут заниматься разработкой user interface, прописыванием логики программы при помощи разных средств. Файлы Xaml при преобразовании в текст открываются, как XML-файлы с расширением .xaml. Они поддерживают множество видов кодировок доступных для XML, чаще всего выбирают UTF-8.
Элементы XAML
- Все элементы Xaml-документа входят в экземпляр класса .NET. Имя данного элемента будет полностью совпадать с названием класса. Для примера, можно взять компонент Button, который является основой для создания объекта класса Button;
- Элементы могут быть вложенными друг в друга. Этот параметр показывает вложенность компонентов интерфейса;
- Атрибуты или внутренние дескрипторы описывают свойства классов, что определяется особым синтаксисом.
- Для XAML характерной является возможность самоописания. Любой элемент документа содержит название типа, например, Label, Button, CheckBox и другие, в пределах указанного пространства имен. Атрибуты применяются для обозначения свойств (Color, Margin, Width и пр.) и действий (Closed, Loaded и пр.) выбранных объектов.
Принцип работы
Стоит остановиться детальные на пути трансформации Xaml-кода в wpf-проекте. Прежде всего, кодировка считывается и конвертируется процессором для определенной платформы во внутренний код, описывающий компонент интерфейса пользователя. Внутреннее кодирование и код C # взаимодействуют между собой через частичные классы, а далее компилятор воссоздает приложение.
Xaml-документы используются для определения места положения окон, кнопок и других компонентов, отвечающих за управление. Ручное XAML-программирование встречается крайне редко. Технология предполагает использование инструмента, который генерирует требуемый код.
Для дизайнеров — это программы для графического дизайна, а для программистов чаще всего VisualStudio. Этот инструментарий поддерживает xaml, а значит, есть возможность создать основу UI на базе Вижуал Студии, а затем отдать наработки дизайнерской команде. В действительности такая возможность интеграции разных специалистов в рабочем процессе считается одной из главных причин создания языка компанией Microsoft.
В сфере разработки давно известно, что создание сложных приложений с насыщенной графической частью значительно проще, если применять метод разделения graphical interface и основного программного кода. Обе основные части могут создаваться и меняться независимо, исключая проблемы версий.
Плюсы и минусы программы
Создавать элементы можно без применения XAML, обходясь только кодом на C#. Но в случае использования можно получить такие преимущества:
- разграничение логики, графического отображения — таким образом, появляется возможность для специалистов разной направленности автономной работы с программой;
- лаконичность, доступность к пониманию;
- относительную простоту в поддержке.
Момент обработки XAML-кода не несет особого значения — за этот процесс отвечает XAML-парсер.
Как и другие языки, он имеет свои недостатки. Один из главных заключается в том, что при создании GUI может потребоваться написать достаточно объемный код.
Одна из важных особенностей в XAML — привязывание данных. Но данное средство разработки может вызывать появление проблем, сложных в исправлении. Их возникновение может быть связано с:
- неправильно приписанная привязка;
- не указывается Data Context;
- попытка передать пустой объект.
Также важно знать, что, если после изучения XAML для WPF, нужно будет перейти к разработке Xamarin. Forms, то там будут свои особенности. Некоторые компоненты имеют другие названия, отличается способ привязывания данных и другие отличия.
Базовый синтаксис языка
XAML основывается на XML, может расширять его. Основная часть терминологии у них общая. Не только основные принципы, но и сам синтаксис базируется на xml. Таким образом, Xaml-код будет допустимым кодом XML. Кроме того, есть отличия в написании кода, уточнения в значении некоторых элементов, которое также поддерживается спецификацией языка-базиса.
Если рассмотреть нюансы синтаксиса свойств, то их значения могут задаваться в элементах, вместо строковых значений атрибутов. То есть, компонент будет определяться для XML-языка, как элемент с точкой в названии, это означает, что он допустим, но содержит другое значение. XAML-код содержит в своей структуре определенную иерархию элементов.
На верхнем уровне находятся Window, Page и Application. В окне есть вложенный Grid, он пустой. Также есть набор атрибутов — Title, Height, Width, которые настраивают заголовок, высоту, ширину.
Еще одна важная часть — это пространство имен. Оно располагается на 2−3 строчках разметки, а подключение к проекту происходит автоматически. Для определения данного пространства нужен атрибут xmlns. В нем содержится описание и определение большей части управляющих элементов, а также определение некоторых свойств.
Разновидности XAML
Для использования кодирования XAML разработано несколько способов. Он был реализован для ссылания на весь язык xaml, который предлагает синтаксис на основе XML для отображения объектного дерева .NET. Данные объекты могут являться кнопками, полями для текста, а также пользовательским классом. По факту, XAML можно использовать на иных платформах для представления объектов, не входящих в .NET.
Выделяют следующие подмножества данного языка разметки:
- WPF — содержит описание содержимого WPF, например, векторную графику, компоненты для управления, документы. Такое использование является наиболее приоритетным на данный момент.
- XPS — является частью предыдущего. Определяет формат отформатированных электронных файлов. Публикуется как независимая спецификация XML Paper.
- Silverlight. Предназначается для приложений Silverlight. Это кроссплатформенный плагин для браузера, который помогает в создании расширенного веб-контента с 2D-графикой, анимированием, аудио-сопровождением, видеофайлами.
- WF. Содержит описание того, что содержится в Windows Workflow Foundation.
XAML — это эффективный инструмент для создания Graphical User Interface программ. После его изучения, процесс разработки становится проще. Кроме того, такой код могут понять не только разработчики, но и дизайнеры. Это дает возможность создавать красивые приложения с дружелюбным к пользователю интерфейсом.
Источник: synergy.ru