Содержание
XAML — это декларативный язык программирования общего назначения, предназначенный, в настоящее время, в основном для конструирования и инициализации объектов визуального интерфейса приложения. Одна из целей использования XAML при разработке приложений — отделить логику приложения от его интерфейса.
Основные правила XAML
Каждый элемент в документе XAML отображается на экземпляр класса .NET
При этом, имя элемента в разметке XAML в точности соответствует имени класса. Например, элемент <Button> из предыдущей статьи сообщает WPF, что должен быть создан объект Button.
<Button Content="Нажми меня" Width="200" Height="60" Click="Button_Click"/>
Код C# с помощью которого мы могли бы получить точно такой же результат, выглядит следующим образом:
Button button = new Button(); button.Content = "Нажми меня"; button.Width = 200; button.Height = 60; button.Click += new RoutedEventHandler(Button_Click);
Различие в том, что при написания кода XAML результат будет виден сразу же в визуальном редакторе. При создании же кнопки в коде C# нам необходимо будет вначале скомпилировать и запустить приложение, чтобы увидеть результат.
Свойства каждого класса можно устанавливать через атрибуты
Собственно, это правило наглядно продемонстрировано в примере выше для кнопки. В XAML атрибуты Content, Width и Height являются, по сути, свойствами класса Button.
Как и любой XML-документ, код XAML допускает вложение одного элемента внутрь другого
Вложение обычно является способом выразить включение (containment). Другими словами, если вы видите элемент Button внутри элемента Grid, то пользовательский интерфейс включает Grid, содержащий внутри себя Button. Например,
<Grid Name="grid">
<Button Content="Нажми меня" Width="200" Height="60" Click="Button_Click"/>
</Grid>
Здесь стоит обратить внимание на элемент Grid, а точнее, на его атрибут Name. Следуя предыдущему правилу, мы установили для класса Grid значение свойства Name как «grid». Теперь мы можем продемонстрировать то, как будет выглядеть аналогичный код, написанный на C#.
Button button = new Button(); button.Content = "Нажми меня"; button.Width = 200; button.Height = 60; button.Click += new RoutedEventHandler( Button_Click); _ = grid.Children.Add(button);
В последней строке мы добавляем к списку дочерних элементов grid созданную кнопку.
Пространства имен XAML
Когда мы пишем код на C#, то для того, чтобы получить доступ к каким-либо классам, мы подключаем соответствующие пространства имен с помощью директивы using, например
using System.Windows.Controls;
В XAML, чтобы задействовать какое-либо элементы, мы также подключаем пространства имен, но уже используя правила работы как с XML. Например, посмотрим на содержимое файла MainWindow.xaml
<Window x:Class="HelloWpf.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:HelloWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
Вторая и третья строчки представляют собой пространства имен, подключаемые в проект по умолчанию. А атрибут xmlns представляет специальный атрибут для определения пространства имен в XML.
Пространство имен http://schemas.microsoft.com/winfx/2006/xaml/presentation
содержит описание и определение большинства элементов управления. Так как это пространство имен является пространством имен по умолчанию, то оно объявляется без каких-либо префиксов. При этом, следует отметить, что сопоставление пространства имен http://schemas.microsoft.com/winfx/2006/xaml/presentation в XAML и пространства имен в C# производится не так, как свойства класса C# и атрибут элемента в XAML. Так, подключение в XAML пространства имен http://schemas.microsoft.com/winfx/2006/xaml/presentation приведет к тому, что в проект будут подключены следующие пространства имен C#:
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
Пространство имен http://schemas.microsoft.com/winfx/2006/xaml
Определяет некоторые свойства XAML, например свойство Name или Key. Используемый префикс x в определении xmlns:x означает, что те свойства элементов, которые заключены в этом пространстве имен, будут использоваться с префиксом x — x:Name или x:Key. Это же пространство имен используется в первой строчке в файле MainWindow.xaml
x:Class="HelloWpf.MainWindow
Пространство имен http://schemas.microsoft.com/expression/blend/2008
Предоставляет поддержку атрибутов в режиме дизайнера. Это пространство имен, в основном, предназначено для другого инструмента по созданию дизайна на XAML — Microsoft Expression Blend.
Пространство имен http://schemas.openxmlformats.org/markup-compatibility/2006
обеспечивает режим совместимости разметок XAML. В определении объекта Window можно найти применение этого пространства имен, а именно:
mc:Ignorable="d"
Это выражение позволяет игнорировать парсерам XAML во время выполнения приложения дизайнерские атрибуты из пространства имен с префиксом d, то есть из пространства имен http://schemas.microsoft.com/expression/blend/2008.
xmlns:local=»clr-namespace:HelloWpf» — пространство имен текущего проекта
Так как в предыдущей части мы создавали проект с названием HelloWpf, то Visual Studio по умолчанию создало для такого проекта пространство имен HelloWpf. Через префикс local мы можем получить в XAML различные объекты, которые были определены в проекте.
Итого
С помощью языка разметки XAML можно достаточно выразительно описать интерфейс приложения. При этом, для создания каких-либо классов и объектов, например, кнопки, метки и так далее в XAML используются элементы, наподобие элементов XML и каждому элементу XAML соответствует аналогичный класс C#. Для определения свойств в XAML используются атрибуты и, при этом, каждый атрибут соответствует аналогичному свойству класса. Что касается пространств имен, то здесь в XAML используется правило «многие к одному», то есть одному пространству имен XAML могут соответствовать несколько пространств имен .NET.