Главная » C#, Windows Runtime, XAML, Разработка для Windows 8 » Пространства имен в XAML

0

Будь то Windows Runtime или одна из библиотек .NET Framework, все  классы внутри этих библиотек разбиты на отдельные логические  группы. Разбиение достигается с помощью пространств имен. Так, класс Button в Windows Runtime находится  в  пространстве  имен  Windows.UI.Xaml.Controls. Соответственно, полное  имя  класса  Button  можно  записать  как  Windows.UI.Xaml.Controls. Button,  но   подобная  запись  встречается  редко.  Вместо  этого  используют директиву using.

В XML, как и в C#, также есть понятие пространств имен. Отличие состоит в том, что в XML обычно используется URI в качестве имени, кроме того, может быть только одно пространство имен по умолчанию, а для остальных задается специальная приставка, требующаяся при записи элементов из этого пространства.

Чтобы  задать  пространство имен  по  умолчанию, необходимо  использовать специальный атрибут xmlns. Это ключевое слово, которое может быть указано в любом из элементов. При этом областью действия указанного элемента являются не только все дочерние элементы, но и сам элемент, где используется атрибут.

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

xmlns:x="http://baydachnyy.com/schemas"

Рассмотрим пример заголовка страницы приложения в стиле Metro:

<Page x:Class="Application3.BlankPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Application3">

В этом коде используются три пространства имен. Последнее из них позволяет подключить  возможность  использования  элементов,   определенных  в  код (пространство  имен  Application3),  а  первые   два  можно  встретить  также в приложениях в стиле Silverlight и WPF.

Первое  пространство  имен  http://schemas.microsoft.com/winfx/2006/xaml/ presentation описывает все стандартные элементы, которые используются при построении интерфейсов. Нужно отметить, что при использовании кода на C# стандартные элементы входят в различные пространства  имен, в отличие от XAML. В XAML же используется одно пространство для всех элементов. Это было сделано для упрощения синтаксиса. Иначе пришлось бы создавать множество именованных пространств, способствующее путанице.

Второе   пространство  имен   http://schemas.microsoft.com/winfx/2006/xaml имеет служебное назначение. В нем содержится определение ряда атрибутов. Дизайнер дает этому пространству имен имя x, которое уже устоялось.

Конечно, Вы не сможете обойтись только стандартными пространствами имен. Так, при подключении собственных (или  приобретенных) сборок необходимо указать анализатору XAML, где искать Ваши классы. Для этой цели используется все тот же атрибут xmlns, но вместо URI он принимает имя пространства имен. В нашем случае это Application3.

Подключение кода и обработчиков событий

После того, как мы рассмотрели основные синтаксические конструкции XAML, перейдем к определению того, как XAML  интегрируется с кодом на C#. Для этого вернемся к  первому  приложению, написанному в  предыдущей главе, и внимательно посмотрим на заголовок BlankPage.xaml:

<Page x:Class="HelloWin8App.BlankPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWin8App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"

Loaded="Page_Loaded" Unloaded="Page_Unloaded">

Visual Studio автоматически создает два файла: BlankPage.xaml и BlankPage.cs. При этом в файле BlankPage.cs создается класс, который и будет содержать весь код на C#, ассоциированный с нашим приложением (главным окном). Как видно из кода выше, ссылка на класс BlankPage.cs задается в XAML файле с помощью атрибута Class.

Добавим в созданное приложение кнопку с именем myButton:

<Button Name="myButton" Width="100" Height="50">Hello</Button>

А теперь попробуйте открыть код файла MainPage.cs. Класс  MainPage будет выглядеть следующим образом:

public sealed partial class BlankPage : Page

{

public BlankPage()

{

InitializeComponent();

}

}

Поэкспериментируйте немного с кодом и введите имя созданной  кнопки. Как ни  странно, система  IntelliSense работает. Между  тем,  определение объекта типа Button в нашем коде на C# отсутствует. Метод InitializeComponent также отсутствует.

Как и в случае с Silverlight, компилятор разбивает файл на две части: Ваш код и код, сгенерированный дизайнером Visual Studio. Чтобы увидеть вторую часть класса, щелкните правой кнопкой мыши на вызове метода InitializeComponent и выберите пункт контекстного меню Go To Definition. В результате на экране отобразится вторая часть класса, которая находится в файле BlankPage.g.i.cs:

public partial class BlankPage : Windows.UI.Xaml.Controls.Page

{

private Windows.UI.Xaml.Controls.Button myButton; private bool _contentLoaded;

 [System.CodeDom.Compiler.GeneratedCodeAttribute( "Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]

[System.Diagnostics.DebuggerNonUserCodeAttribute()] public void InitializeComponent()

{

if (_contentLoaded) return;

_contentLoaded = true; Application.LoadComponent(this,

new System.Uri("ms-appx:///BlankPage.xaml"),

Windows.UI.Xaml.Controls.Primitives.ComponentResourceLocation.Application);

myButton = (Windows.UI.Xaml.Controls.Button)this.FindName("myButton");

}

}

Как видно из кода, тут происходит определение всех созданных в дизайнере XAML элементов управления, а в методе InitializeComponent загружается сам XAML с помощью метода LoadComponent. XAML загружается из пакета приложения, о чем свидетельствует приставка ms-appx перед именем файла.

После создания дерева объектов и привязки его к текущему окну (LoadComponent использует «this» для загрузки дерева и ассоциации его с текущим экземпляром окна) происходит инициализация переменных, имена и типы которых совпадают с теми, которые мы указали в XAML файле:

myButton = (Windows.UI.Xaml.Controls.Button)this.FindName("myButton");

Таким  образом,  BlankPage.g.i.cs  компилируется  совместно  с   BlankPage.cs,

а файл XAML используется Visual Studio для генерации недостающего кода.

Если вернуться к корневому элементу в файле XAML, можно сделать вывод, что атрибут Class — это всего лишь подсказка для Visual Studio, чтобы сгенерировать класс с нужным именем.

Между  тем,  нужно  отдать  должное  системе  IntelliSense, которая  генерирует промежуточный класс «на лету», скрывая ненужные детали от разработчика.

Перейдем к механизму подключения обработчиков событий. Тут все  просто: достаточно записать имя события в качестве атрибута, а имя метода-обработчика события — указать в качестве значения:

Loaded="Page_Loaded" Unloaded="Page_Unloaded">

Дополнительные преимущества дает  Visual Studio, где  при  выборе  события появляется возможность создать новый обработчик события или выбрать один из существующих:

Рис. 2.1.

Если Вы хотите посмотреть все события элемента, это можно сделать через окно свойств:

Рис. 2.2.

Кроме того, каждый элемент управления определяет событие по  умолчанию, обработчик которого может быть сгенерирован с  помощью двойного щелчка на элементе.

Сергей Лутай, Сергей Байдачный, Windows 8 для C# разработчиков

По теме:

  • Комментарии