На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

GeekBrains

4 подписчика

Язык декларативного программирования XAML

XAML — это язык разметки, разработанный компанией Microsoft. Он используется для инициализации объектов в технологиях на платформе .NET. Это простой декларативный язык, основанный на XML и чем-то похожий на HTML в веб-разработке. С помощью XAML можно легко создавать, инициализировать и устанавливать свойства объектов с иерархическими отношениями.

 

XAML в основном используется для разработки графических интерфейсов в технологиях WPF (Windows Presentation Foundation), а также Silverlight. Но сфера применения этим не ограничивается. Данный язык также задействуется в технологиях WCF (Windows Communication Foundation) и WF (Windows Workflow Foundation), где он никак не связан с графическим интерфейсом.

Одна из приятных особенностей XAML — кросс-платформенность. XAML используется не только в WPF, но и в Xamarin.Forms. Это позволяет разработчикам ПО для компьютеров быстро начать создавать мобильные приложения. Можно один раз написать интерфейс — и он будет работать на Android, iOS и UWP (Windows 10). При этом XAML скомпилируется в нативный код для этих платформ.

Как работает XAML

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

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

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

Речь о таких языках, как XAML, XML, HTML, SQL и другие. В случае с XAML за то, как прийти в заданное состояние, отвечает XAML-процессор.

Рассмотрим процесс преобразования XAML-кода в WPF-проекте.

Сначала XAML-код преобразуется процессором XAML для конкретной платформы во внутренний код, который описывает элемент пользовательского интерфейса. Внутренний код и код C# связываются друг с другом посредством частичных классов, и затем компилятор .NET создаёт приложение.

Если наш файл XAML интерпретируется процессором как C#-код, зачем нам вообще нужен XAML? Самое время поговорить о его плюсах.

Преимущества XAML

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

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

Рассмотрим следующий пример. Допустим, нам нужно отобразить текст «Hello world!»  в элементе TextBlock. Если бы мы делали это на С#, то выглядело бы это так:

 TextBlock textBlock = new TextBlock(); textBlock.Text = "Hello world!";

На XAML так:

 <TextBlock Text="Hello world!"/>

Как говорится, комментарии излишни. То, как будет обрабатываться XAML-код, нас не волнует — этим занимается XAML-парсер. Использование XAML-кода в GUI-приложениях позволяет отделить графический интерфейс от бизнес-логики программы.

Структура XAML

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

 <Window x:Class="XamlApp.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"         xmlns:local="clr-namespace:XamlApp"         mc:Ignorable="d"         Title="MainWindow" Height="350" Width="525">     <Grid>       </Grid> </Window>

Подобно структуре веб-страницы на HTML, здесь есть иерархия элементов. Элемент верхнего уровня — Window, это окно приложения. Кроме него есть ещё два элемента верхнего уровня: Page и Application.

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

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

Префикс x в определении xmlns:x означает, что те свойства элементов, которые заключены в этом пространстве имён, будут использоваться с префиксом x — x:Name или x:Key. Это же пространство имён используется уже в первой строчке x:Class="XamlApp.MainWindow" — здесь создаётся новый класс MainWindow и соответствующий ему файл кода, куда будет прописываться логика для этого окна приложения.

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

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

 <Window></Window>

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

 <Window />

Каждый элемент в XAML соответствует определённому классу C#. Например, элемент Button соответствует классу System.Windows.Controls.Button. Добавим кнопку в разметку окна:

 <Window x:Class="XamlApp.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"         xmlns:local="clr-namespace:XamlApp"         mc:Ignorable="d"         Title="MainWindow" Height="350" Width="525">     <Grid x:Name="grid1">         <Button x:Name="button1"  Width="100" Height="30" Content="Кнопка" />     </Grid> </Window>

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

Для кнопки мы можем определить свойства в виде атрибутов. Здесь заданы атрибуты x:Name (имя кнопки), Width, Height и Content. Определив разметку XAML, запускаем проект — и видим весь код XAML в графике, то есть нашу кнопку:

Недостатки XAML

Как и у любого языка, у XAML есть недостатки. Чтобы создать графический интерфейс, иногда требуется написать много кода. Например, чтобы кнопка меняла свой код при наведении, нужен следующий XAML-код:

 <Style x:Key="SendButton">     <Style.Setters>         <Setter Property="Border.Margin" Value="1" />         <Setter Property="Border.Background" Value="#333" />         <Setter Property="TextBlock.Foreground" Value="#fff" />         <Setter Property="TextBlock.FontWeight" Value="DemiBold"/>         <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>         <Setter Property="TextBlock.TextAlignment" Value="Center"/>         <Setter Property="Border.Padding" Value="10, 5" />         <Setter Property="Button.Template">             <Setter.Value>                 <ControlTemplate>                     <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Border.Padding}">                         <TextBlock Text="{TemplateBinding Button.Content}"/>                     </Border>                 </ControlTemplate>             </Setter.Value>         </Setter>     </Style.Setters>     <Style.Triggers>         <Trigger Property="Control.IsMouseOver" Value="true">             <Setter Property="Button.Background" Value="#444"/>         </Trigger>     </Style.Triggers> </Style>

В то же время на CSS это можно было сделать намного проще:

 .button { 	background: #333; }   .button:hover { 	background: #444; }

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

  • неправильно указана привязка;
  • не указан DataContext;
  • передаётся пустой объект; 
  • и так далее.

Возможно, освоив XAML для WPF, вы захотите перейти к разработке Xamarin.Forms. Но там используется немного другой XAML: у некоторых элементов другие имена (StackLayout вместо StackPanel). Привязка данных создаётся тоже по-другому, не так, как вы привыкли в WPF. 

Заключение

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

 

Ссылка на первоисточник
наверх