Пространства от имена в XAML
Независимо дали става дума за Windows Runtime или за една от библиотеките на .NET Framework, всички класове в тези библиотеки са разделени на отделни логически групи. Разделянето се постига с помощта на пространства от имена. Например класътButtonв Windows Runtime е в пространството от именаWindows.UI.Xaml.Controls. Съответно, пълното име на класButtonможе да бъде написано катоWindows.UI.Xaml.Controls. Бутон, но такъв запис е рядък. Вместо това се използва директивата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, той приема името на пространството от имена. В нашия случай това еПриложение3.
Свързване на код и манипулатори на събития
След като разгледахме основните XAML синтактични конструкции, нека да преминем към дефинирането на това как XAML се интегрира с C# код. За да направите това, нека се върнем към първото приложение, написано в предишната глава, и да разгледаме по-отблизо заглавката BlankPage.xaml:
Нека добавим бутон с имеmyButtonкъм създаденото приложение:
Сега опитайте да отворите кодаMainPage.cs. КласътMainPageще изглежда така:
публичен запечатан частичен клас BlankPage : Страница
Поиграйте малко с кода и въведете име за бутона, който сте създали. Колкото и да е странно, системата IntelliSense работи. Междувременно няма дефиниция на обект от типButtonв нашия C# код. МетодътInitializeComponentсъщо липсва.
Както при Silverlight, компилаторът разделя файла на две части: вашия код и кода, генериран от дизайнера на Visual Studio.За да видите втората част на класа, щракнете с десния бутон върху извикването на методаInitializeComponentи изберете елемента от контекстното менюGo To Definition. В резултат на това екранът ще покаже втората част от класа, която се намира във файлаBlankPage.g.i.cs:
публичен частичен клас 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 = вярно; Application.LoadComponent(това,
Както можете да видите от кода, всички контроли, създадени в XAML дизайнера, са дефинирани тук, а самият XAML се зарежда с помощта на методаLoadComponentв методаInitializeComponent. 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# разработчици