XAML в Silverlight

Последнее обновление: 1.11.2015

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, который также имеет сложную структуру.


Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850