Близкий взгляд на WPF. Часть 1. Знакомство с XAML
Использование XAML(читается «замл») является основным способом декларативного программирования в среде WPF. Вот небольшой пример кода XAML, который используется для определения окна с текстом и кнопкой, визуально «прилепленными» к друг другу.
На рисунке показаны основные элементы этого простого примера. Весь документ занимает тэг Window, который декларативно определяет окно, его свойства и содержимое. Атрибут (1) задает имя так называемого Code-behind класса, то есть класса, который будет содержать процедурную программную логику для данной разметки. Понятие Code-behind классов позаимствовано из ASP.NET, где оно имеет практически ту же семантику и широко используется. Code-behind класс для данной разметки мы рассмотрим здесь чуть позже.
Атрибуты (2) содержат описания того, какие XML-пространства имен используются в данном документе. Те два пространства имен, которые мы видим на рисунке, используются в WPF практически всегда; их использование учтено в шаблонах для создания соответствующих элементов проектов Visual Studio. Первое пространство имен содержит описание стандартных элементов WPF и используется по-умолчанию, второе – описание специальных расширений XAML и по соглашению имеет псевдоним x. Также XAML предлагает специальный синтаксис для подключения пространств имен .NET; это выглядит следующим образом:
Как видно, для того, чтобы подключить CLR-пространство имен к вашему документу, необходимо назначить ему псевдоним, указать собственно его имя и имя сборки. Насколько я знаю, для того чтобы это работало, ссылка на эту сборку должна быть добавлена в проект. Для того чтобы добавить ссылку на пространство имен из текущей сборки, нужно просто опустить часть «;assembly=XXX».
Атрибуты (3) содержат описание некоторых свойств окна; здесь это заголовок, ширина и высота. Здесь все довольно просто.
Далее находятся тэги, которые описывают содержимое окна. Непосредственным логическим «ребенком» окна является панель типа StackPanel (4), которая используется для обеспечения последовательного горизонтального (как в данном случае) или вертикального размещения дочерних элементов.
В эту панель вложены два стандартных элемента управления: текстовый блок (5) и кнопка (6). Описание кнопки задает ее имя (которое будет доступно как имя члена класса типа Button из Code-behind класса) и подразумевает наличие обработчика события Click (7) также в этом процедурно описанном классе.
Прежде чем мы перейдем к рассмотрению code-behind класса, хочу сказать, что мне очень нравится возможность задавать имена только для тех элементов, для которых они нужны (как в случае с кнопкой). Известно, что в Windows Forms ситуация сложилась по другому – даже для самого незначительных сплиттера и панели нужно задавать имена и чаще всего они имеют вид вроде splitter1; затем, как показывает практика, разработчики привыкают к этому и начинают давать такие «безымянные» имена даже значимым элементам. Здесь же легко применить всегда полезный принцип – если надо что-то назвать – подумай и назови хорошо, а если не надо – то и не беспокойся.
На рисунке выше показан вид code-behind класса для описанной разметки. Выглядит очень похоже на описание такого же класса для Windows Forms – все очень просто. Впрочем, так и должно быть.
Кстати, у нас есть возможность выразить то, что мы сделали при помощи XAML, на C#. Если посмотреть на такой код (он будет похож на сериализованный код дизайнера Windows Forms), то он будет в полтора-два раза объемнее чем XAML, а элегантность и лаконичность не стоит даже и сравнивать.