Простору імен в XAML

Будь то Windows Runtime або одна з бібліотек NET Framework, всі класи всередині цих бібліотек розбиті на окремі логічні групи Розбиття досягається за допомогою просторів імен Так, клас Button в Windows Runtime знаходиться в просторі іменWindowsUIXamlControls Відповідно, повне імя класуButton  можна записати якWindowsUIXamlControls Button, Але подібна запис зустрічається рідко Замість цього використовують директиву using

У XML, як і в C #, також є поняття просторів імен Відмінність полягає в тому, що в XML зазвичай використовується URI як імя, крім того, може бути тільки один простір імен за замовчуванням, а для інших задається спеціальна приставка, требующаяся при записі елементів з цього простору

Щоб задати простір імен за замовчуванням, необхідно використовувати спеціальний атрибут xmlns Це ключове слово, яке може бути зазначено в будь-якому з елементів При цьому областю дії зазначеного елемента є не тільки всі дочірні елементи, а й сам елемент, де використовується атрибут

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

xmlns:x=&quothttp://baydachnyycom/schemas&quot

Розглянемо приклад заголовка сторінки додатка в стилі Metro:

&ltPage x:Class=&quotApplication3BlankPage&quot xmlns=&quothttp://schemasmicrosoftcom/winfx/2006/xaml/presentation&quot xmlns:x=&quothttp://schemasmicrosoftcom/winfx/2006/xaml&quot xmlns:local=&quotusing:Application3&quot&gt

У цьому коді використовуються три простору імен Останнє з них дозволяє підключити можливість використання елементів, визначених у код (простір іменApplication3), А перші два можна зустріти також у додатках в стилі Silverlight і WPF

Перший простір іменhttp://schemasmicrosoftcom/winfx/2006/xaml/ presentation описує всі стандартні елементи, які використовуються при побудові інтерфейсів Потрібно відзначити, що при використанні коду на C # стандартні елементи входять в різні простори імен, на відміну від XAML У XAML само використовується один простір для всіх елементів Це було зроблено для спрощення синтаксису Інакше довелося б створювати безліч іменованих просторів, що сприяє плутанини

Друге простір іменhttp://schemasmicrosoftcom/winfx/2006/xaml має службове призначення У ньому міститься визначення ряду атрибутів Дизайнер дає цьому простору імен імя x, Яке вже усталене

Звичайно, Ви не зможете обійтися тільки стандартними просторами імен Так, при підключенні власних (або придбаних) зборок необхідно вказати аналізатору XAML, де шукати Ваші класи Для цієї мети використовується все той же атрибут xmlns, Але замість URI він приймає імя простору імен У нашому випадку це Application3

Після того, як ми розглянули основні синтаксичні конструкції XAML, перейдемо до визначення того, як XAML інтегрується з кодом на C # Для цього повернемося до першого додатком, написаним у попередній чолі, і уважно подивимося на заголовок BlankPagexaml:

&ltPage x:Class=&quotHelloWin8AppBlankPage&quot xmlns=&quothttp://schemasmicrosoftcom/winfx/2006/xaml/presentation&quot xmlns:x=&quothttp://schemasmicrosoftcom/winfx/2006/xaml&quot xmlns:local=&quotusing:HelloWin8App&quot xmlns:d=&quothttp://schemasmicrosoftcom/expression/blend/2008&quot xmlns:mc=&quothttp://schemasopenxmlformatsorg/markup-compatibility/2006&quot mc:Ignorable=&quotd&quot

Loaded=&quotPage_Loaded&quot Unloaded=&quotPage_Unloaded&quot&gt

Visual Studio автоматично створює два файли: BlankPagexaml і BlankPagecs При цьому у файлі BlankPagecs створюється клас, який і міститиме весь код на C #, асоційований з нашим додатком (головним вікном) Як видно з коду вище, посилання на клас BlankPagecs задається в XAML файлі за допомогою атрибуту Class

Додамо в створене додаток кнопку з імям myButton:

&ltButton Name=&quotmyButton&quot Width=&quot100&quot Height=&quot50&quot&gtHello&lt/Button&gt

А тепер спробуйте відкрити код файлу MainPagecs КласMainPage буде виглядати наступним чином:

public sealed partial class BlankPage : Page

{

public BlankPage()

{

InitializeComponent()

}

}

Поекспериментуйте трохи з кодом і введіть імя створеної кнопки Як не дивно, система IntelliSense працює Тим часом, визначення обєкта типу Button в нашому коді на C # відсутня Метод InitializeComponent також відсутня

Як і у випадку з Silverlight, компілятор розбиває файл на дві частини: Ваш код і код, що згенерував дизайнером Visual Studio Щоб побачити другу частину класу, клацніть правою кнопкою миші на виклику методу InitializeComponent і виберіть пункт контекстного меню Go To Definition У результаті на екрані відобразиться друга частина класу, яка знаходиться у файлі BlankPagegics:

public partial class BlankPage : WindowsUIXamlControlsPage

{

private WindowsUIXamlControlsButton myButton private bool _contentLoaded

 [SystemCodeDomCompilerGeneratedCodeAttribute( &quotMicrosoftWindowsUIXamlBuildTasks&quot,&quot 4000&quot)]

[SystemDiagnosticsDebuggerNonUserCodeAttribute()] public void InitializeComponent()

{

if (_contentLoaded) return

_contentLoaded = true ApplicationLoadComponent(this,

new SystemUri(&quotms-appx:///BlankPagexaml&quot),

WindowsUIXamlControlsPrimitivesComponentResourceLocationApplication)

myButton = (WindowsUIXamlControlsButton)thisFindName(&quotmyButton&quot)

}

}

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

Після створення дерева обєктів і привязки його до поточного вікна (LoadComponent використовує «this» для завантаження дерева і асоціації його з поточним екземпляром вікна) відбувається ініціалізація змінних, імена і типи яких збігаються з тими, які ми вказали в XAML файл:

myButton = (WindowsUIXamlControlsButton)thisFindName(&quotmyButton&quot)

Таким чином,BlankPagegics  компілюється спільно зBlankPagecs,

а файл XAML використовується Visual Studio для генерації відсутнього коду

Якщо повернутися до кореневого елементу у файлі XAML, можна зробити висновок, що атрибут Class – Це всього лише підказка для Visual Studio, щоб згенерувати клас з потрібним імям

Тим часом, потрібно віддати належне системі IntelliSense, яка генерує проміжний клас «на льоту», приховуючи непотрібні деталі від розробника

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

Loaded=&quotPage_Loaded&quot Unloaded=&quotPage_Unloaded&quot&gt

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

Рис 21

Якщо Ви хочете подивитися всі події елемента, це можна зробити через вікно властивостей:

Рис 22

Крім того, кожен елемент управління визначає подія за замовчуванням, обробник якого може бути згенерований за допомогою подвійного клацання на елементі

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*