Простори імен у XAML
Будь то Windows Runtime або одна з бібліотек .NET Framework, всі класи всередині цих бібліотек розбиті на окремі логічні групи. Розбиття досягається за допомогою просторів імен. Так, класButtonу Windows Runtime знаходиться у просторі іменWindows.UI.Xaml.Controls. Відповідно, повне ім'я класуButtonможна записати якWindows.UI.Xaml.Controls. Button, але подібний запис зустрічається рідко. Натомість використовують директивуusing.
У XML, як і C#, також є поняття просторів імен. Відмінність полягає в тому, що в XML зазвичай використовується URI як ім'я, крім того, може бути тільки один простір стандартних імен, а для інших задається спеціальна приставка, потрібна при записі елементів з цього простору.
Щоб задати простір стандартних імен, необхідно використовувати спеціальний атрибутxmlns. Це ключове слово, яке може бути вказано у будь-якому з елементів. При цьому областю дії зазначеного елемента є не тільки всі дочірні елементи, але й елемент, де використовується атрибут.
Для створення іменованого простору імен використовують аналогічний синтаксис, але із зазначенням імені:
Розглянемо приклад заголовка сторінки програми у стилі Metro:
У цьому коді використовуються три простори імен. Остання дозволяє підключити можливість використання елементів, визначених у код (простір імен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:
Додамо до створеної програми кнопку з ім'ямmyButton:
А тепер спробуйте відкрити код файлуMainPage.cs. КласMainPageвиглядатиме так:
public sealed partial class BlankPage : Page
Поекспериментуйте з кодом і введіть ім'я створеної кнопки. Як не дивно, система 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,
Як очевидно з коду, тут відбувається визначення всіх створених у дизайнері XAML елементів управління, а методіInitializeComponentзавантажується сам XAML з допомогою методуLoadComponent. XAML завантажується з пакета програми, про що свідчить приставкаms-appxперед ім'ям файлу.
Після створення дерева об'єктів та прив'язки його до поточного вікна (LoadComponentвикористовує «this» для завантаження дерева та асоціації його з поточним екземпляром вікна) відбувається ініціалізація змінних, імена та типи яких збігаються з тими, які ми вказали в XAML файлі:
Таким чином,BlankPage.g.i.csкомпілюється спільно зBlankPage.cs,
а файл XAML використовується Visual Studio для генерації коду, що бракує.
Якщо повернутися до кореневого елемента у файлі XAML, можна зробити висновок, що атрибутClass— це лише підказка для Visual Studio, щоб згенерувати клас із потрібним ім'ям.
Тим часом потрібно віддати належне системі IntelliSense, яка генерує проміжний клас «на льоту»,приховуючи непотрібні деталі розробника.
Перейдемо до механізму підключення обробників подій. Тут все просто: достатньо записати ім'я події як атрибут, а ім'я методу-обробника події — вказати як значення:
Додаткові переваги дає Visual Studio, де при виборі події з'являється можливість створити новий обробник події або вибрати один із існуючих:
Якщо Ви хочете подивитися всі події елемента, це можна зробити через вікно властивостей:

Крім того, кожен елемент управління визначає подію за умовчанням, обробник якого може бути згенерований за допомогою подвійного натискання на елементі.
Сергій Лутай, Сергій Байдачний, Windows 8 для C# розробників