XAML (eXtensible Application Markup Language) - язык разметки, используемый для создания пользовательского интерфейса декларативным путем и имеет много общего с html.
Для понимания того, что представляет собой XAML, создадим новый проект приложения Silverlight. Назовем его, к примеру, TestApplication. После создания проекта Visual Studio откроет файл разметки MainPage.xaml, который будет выглядеть следующим образом:
<UserControl x:Class="TestApplication.MainPage" 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" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> </Grid> </UserControl>
Итак, файл у нас начинается с объявления с элемента самого верхнего уровня - элемента UserControl. Все остальные элементы являются вложенными элементами для UserControl. Каждому элементу в XAML соответсвует определенный класс. Например, UserControl соответствует класс UserControl. Элементу Button подобным образом соответствует класс Button. А объявляя элемент в XAML мы все равно что создаем его объект.
Далее у нас следуют объявления пространства имен:
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"
В Silverlight используется синтаксис пространств имен xml. Обратите внимание, что подключаемые здесь пространства имен не эквивалентны подключению
пространств имен с помощью директивы using
. В данном случае используются прстранства имен Silverlight.
Пространство имен http://schemas.microsoft.com/winfx/2006/xaml/presentation заключает описание и определение большинства элементов управления. Так как является пространством имен по умолчанию, то объявляется без всяких префиксов.
Пространство имен http://schemas.microsoft.com/winfx/2006/xaml - это пространство имен, включающее некоторые свойства XAML,
например, свойство Name или Key. Используется с префиксом x, это значит, что те свойства элементов, которые заключены в этом пространстве имен,
будут использоваться с префиксом x - x:Name или x:Key. Это же пространство имен используется уже в первой строчке
x:Class="TestApplication.MainPage"
, где создается создается новый класс MainWindow и соответствующий ему файл кода,
куда будет прописываться логика для данного окна приложения.
Мы можем также импортировать любые другие доступные нам пространства имен платформы .NET. Общий синтаксис задания пространстd имен таков:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
сначала идет спецификатор xmlns, затем - префикс, на который будет отображаться пространство имен (любой не занятый префикс), после clr-namespace идет пространство имен, а после assembly - сборка, в которой оно находится.
Затем уже в xaml-коде можно обращаться к классам из подключенных пространст имен по префиксу, например sys:String - в данном случае sys - префикс для пространства System, а именно там находится класс String
<UserControl x:Class="TestApplication.MainPage" 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:sys="clr-namespace:System;assembly=mscorlib" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <sys:String x:Key="Monday">Понедельник</sys:String> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> </Grid> </UserControl>
Правда, это не значит, что мы свободно можем использовать какие угодно классы из различных пространств имен. Здесь есть определенные ограничения.
Корневным элементом для UserControl является Grid. Объвление элементов не представляет особых сложностей. Сначала мы указываем после угловой скобки элемент, затем его различные атрибуты. В данном случае у элемента Grid определено два атрибута Name (имя) и Background (фон). Атрибуты элемента соответствуют свойствам соответствующего класса, и мы могли создать элемент Grid наподобие в коде:
Grid layRoot = new Grid(); layRoot.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
Кроме свойств мы можем определить и события. Итак, создадим кнопку и определим событие ее нажатия:
<Grid x:Name="LayoutRoot" Background="White"> <Canvas> <Button x:Name="Button1" Click="Button1_Click" Canvas.Top="20" Width="20" Height="20" /> </Canvas> </Grid>
Здесь мы создали кнопку, вложенную в элемент Canvas и связанную с обработчиком Button1_Click. Затем уже в файле кода мы добавляем логику в метод Button1_Click.
Также обратите внимание на прикрепляемое свойство Canvas.Top, которое хотя и указывается у элемента Button, но применяется к элементу
Canvas. Если мы хотим установить прикрепляемое свойство в коде, то должны использовать следующий синтаксис:
тип_элемента.SetИмя_Свойства(Элемент, значение)
. То есть то же самое мы могли бы установить в файле кода с помощью следующей строки:
Canvas.SetTop(Button1, 20);
Нередко свойство определенного элемента в качестве значения принимает не просто значение типа int или string, но и целый объект некоторого класса. Посмотрем на примере. Чтобы задать цвет кнопки мы можем установить фон как и остальные свойства:
<Button x:Name="Button1" Click="Button1_Click" Width="200" Height="80" Content="Click Me" Background="Red">
Но свойство Background можно представить как сложное, которое принимает в качестве значения объект кисти, например:
<Button x:Name="Button1" Click="Button1_Click" Width="200" Height="80" Content="Click Me"> <Button.Background> <SolidColorBrush Color="Red" /> </Button.Background> </Button>
В данном случае мы в качестве значения свойства Background использовали объект SolidColorBrush. Причем также определили свойство Color у этого объекта. Данный пример, конечно, не очень показателен, так как мы могли вполне обойтись и без SolidColorBrush, но что если мы захотим задать кнопке градиент:
<Button x:Name="Button1" Click="Button1_Click" Width="200" Height="80" Content="Click Me"> <Button.Background> <LinearGradientBrush> <LinearGradientBrush.GradientStops> <GradientStop Color="Aqua" Offset="0" /> <GradientStop Color="Red" Offset="1" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Button.Background> </Button>
В этом случае в качестве фона кнопки мы задаем линейный градиент - объект LinearGradientBrush, который также имеет сложную структуру.