Содержание
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.