XAML и пространства имен

150

XAML (Extensible Application Markup Language — расширяемый язык разметки приложений) предназначен для определения объектов .NET. Технология XAML применяется во многих областях, однако изначально она разрабатывалась как часть технологии WPF (Windows Presentation Foundations), которая позволяет разработчикам приложений Windows создавать мощные пользовательские интерфейсы. Для создания интерфейсов приложений Silverlight используется тот же стандарт XAML, что и в WPF.

Концептуально язык XAML играет ту же роль, что и HTML или XHTML — он предназначен для определения элементов, размещаемых в области содержимого. Для манипулирования элементами XHTML используется клиентский код JavaScript, а элементами XAML — клиентский код C#. Документы XHTML и XAML основаны на синтаксисе XML и состоят из элементов, вложенных друг в друга в любой последовательности.

Т.к. в WPF и Silverlight используется один и тот же стандарт XAML здесь я не буду описывать структуру и синтаксис этого языка разметки. За более подробными сведениями обращайтесь в раздел "Основы WPF".

Пространства имен XAML

При наличии в файле XAML элемента <UserControl> синтаксический анализатор Silverlight воспринимает его как задание создать экземпляр класса UserControl. Однако он не знает, что это за класс. Ведь, несмотря на то что пространство имен Silverlight содержит только один класс UserControl, нет никакой гарантии того, что разработчик не создал пользовательский класс с таким же именем. Следовательно, чтобы был создан нужный класс, необходим способ задания пространства имен.

В Silverlight классы разрешаются путем добавления пространств имен XML к пространствам имен Silverlight. Специальный атрибут xmlns зарезервирован в XML для объявления пространств имен.

Пространства имен XML объявляются с помощью атрибутов, размещенных в открывающих дескрипторах. Существует соглашение, согласно которому все используемые в документе пространства имен должны быть объявлены в первом дескрипторе. Это существенно облегчает визуальный анализ документа, поскольку избавляет от необходимости искать объявления во всей разметке. После объявления пространства имен его можно использовать в любом месте документа.

Базовые пространства имен Silverlight

Для доступа к важным частям инфраструктуры Silverlight используются следующие пространства имен:

http://schemas.microsoft.com/winfx/2006/xaml/presentation

Базовое пространство имен Silverlight. Оно содержит все классы Silverlight, включая UserControl и Grid. Обычно оно объявляется без префикса, поэтому служит пространством имен, заданным по умолчанию для всего документа. Другими словами, если не указано иное, каждый элемент автоматически располагается в этом пространстве имен.

http://schemas.microsoft.com/winfx/2006/xaml

Пространство имен XAML. Содержит различные средства XAML, позволяющие манипулировать способами интерпретации документа. Данное пространство имен обозначается префиксом х. Это означает, что его можно применить, расположив префикс перед именем элемента (<х:имя_элемента> и х:Class="имя_класса").

Информация о пространстве имен позволяет синтаксическому анализатору XAML найти нужный класс. Например, когда синтаксический анализатор видит элементы UserControl и Grid, он знает, что они принадлежат установленному по умолчанию пространству имен http://schemas.microsoft.com/winfx/2006/xaml/presentation. Благодаря этому анализатор находит соответствующие классы System.Windows.UserControl и System.Windows.Controls.Grid.

Пространства имен XML и Silverlight

Пространство имен XML не добавлено в какое-либо одно пространство имен Silverlight. Вместо этого все пространства имен Silverlight находятся в одном и том же пространстве имен XML.

Создатели спецификации XAML предпочли такую архитектуру по нескольким причинам. По общепринятым соглашениям пространства имен XML часто имеют форму URI (как в данном случае). Имена пространств имен выглядят так, будто они указывают на некоторый ресурс в Интернете, но в действительности они ни на что не указывают. Формат URI применяется, чтобы гарантировать уникальность имен, присвоенных разным пространствам имен. Разные организации не имеют одинаковых URI, поэтому они могут присваивать свои URI собственным пространствам имен, не опасаясь, что кто-либо применит такое же имя. Домен schemas.microsoft.com принадлежит компании Microsoft, поэтому только Microsoft может использовать этот URI в пространствах имен XML.

Еще одна причина отсутствия взаимно однозначного соответствия между пространствами имен XML и Silverlight состоит в том, что это существенно усложнило бы документы XAML. Если бы каждое пространство имен Silverlight было представлено как отдельное пространство имен XML вам пришлось бы выбирать правильное пространство имен для каждого элемента управления. Документы XAML и Silverlight быстро превратились бы в беспорядочное месиво. Поэтому создатели Silverlight предпочли отобразить все пространства имен Silverlight, содержащие элементы пользовательских интерфейсов, на единственное пространство имен XML. Это допустимо, поскольку Microsoft гарантирует, что в разных пространствах имен Silverlight никакие два класса не носят одно и то же имя.

Рабочие пространства имен

Кроме базовых, есть два специальных пространства имен, ни одно из которых не является обязательным:

http://schemas.microsoft.com/expression/blend/2008

Пространство имен XAML, связанное с проблемами совместимости разметки с рабочей средой. Используется для сообщения синтаксическому анализатору XAML о том, какую информацию нужно обработать, а какую — проигнорировать.

http://schemas.openxmlformats.org/markup-compatibility/2006

Зарезервированное рабочее пространство имен XAML, поддерживаемое программами Expression Blend и Visual Studio 2010. Используется для установки размеров графической панели для страницы.

В приведенном ниже примере применены оба этих пространства имен:

mc:Ignorable="d"
    d:DesignWidth="400" d:DesignHeight="300">

Свойства DesignWidth и DesignHeight находятся в пространстве имен http://schemas.microsoft.com/expression/blend/2008. Они сообщают рабочей среде, что во время разработки страница должна иметь размеры 400x300 пикселей. Без этого вы были бы вынуждены работать на стесненной графической панели, не отображающей реального вида пользовательского интерфейса, или жестко закодировать размеры с помощью свойств Width и Height (это решение не идеальное, потому что при его использовании размеры страницы не будут изменяться в зависимости от размеров окна браузера).

Свойство Ignorable находится в пространстве имен http://schemas.openxmlformats.org/markup-compatibility/2006. Оно сообщает инструменту XAML о том, что он должен проигнорировать части документа, обозначенные префиксом d и расположенные в пространстве имен http://schemas.microsoft.com/expression/blend/2008. Иными словами, если синтаксический анализатор XAML не поймет слова DesignWidth и DesignHeight, их лучше пропустить, потому что они не так уж важны.

Пользовательские пространства имен

Во многих ситуациях необходим доступ к собственным пространствам имен в файле XAML. Чаще всего он необходим, когда нужно применить пользовательский элемент управления Silverlight (пользовательским называется элемент управления, созданный вами или другим разработчиком, а не компанией Microsoft). В этом случае нужно определить новый префикс пространства имен XML и добавить его в пользовательскую сборку. Это можно сделать следующим образом:

<UserControl х:Class="SilverlightApplication1.MainPage" 
   xmlns:w="clr-namespace:Widgets;assembly=WidgetLibrary"
   ...

Объявление пространства имен определяет три важных параметра:

Префикс пространства имен XML

Применяется для ссылки на пространство имен в документе XAML. В данном примере задан префикс w, однако можно задать любой идентификатор, не конфликтующий с другими префиксами пространств имен.

Название пространства имен .NET

В данном примере все классы расположены в пространстве имен Widgets. Если есть классы, которые нужно использовать в разных пространствах имен, их можно отобразить на разные или одно и то же пространство имен XML, при условии, что они не конфликтуют с другими именами классов.

Имя сборки

В данном примере классы находятся в сборке WidgetLibrary.dll. Расширение .dll в имя сборки не добавляется.

Отобразив пространство имен .NET на пространство имен XML его можно использовать в любом месте документа XAML. Например, если пространство имен Widgets содержит элемент управления HotButton, создать его экземпляр можно следующим образом:

<w:HotButton ...>
Пройди тесты
Лучший чат для C# программистов