WPF ресурси
Първото място, където програмистът се сблъсква с необходимостта да отдели дисплея от самите данни, са ресурсите. Всеки елемент има свойство Resources, което е прост речник2, който ви позволява да търсите стойност по ключ. Тази проста техника се използва при тематизиране, стилизиране и обвързване на данни.
В програма на C# можете да дефинирате променливи за по-късна употреба. Често това се прави с цел четимост на кода, а понякога и с цел обобщение:
публичен клас Window1 : Прозорец
Brush toShare = нова SolidColorBrush(Colors.Yellow);
Бутон b = нов бутон(); b.Content="Моят бутон"; b.Background = toShare;
При маркирането този проблем не е толкова прост. Модел за анализ на XAML
изисква всички създадени обекти да бъдат свойства на нещо. Ние искаме да
Ориз. 6.1. Предефиниране на ресурси в йерархия на елементи
Като се има предвид съставът на елементите, бихме искали търсенето да се извършва, като се вземе предвид йерархията. Ако непосредственият родител на елемента не съдържа някаква променлива, тогава трябва да се търси следващият родител и т.н.
В този пример ние предефинираме един и същ ресурс на няколко нива на дървото на елементите. Първо, стойността на toShare се дефинира в основния елемент Window, точно както преди. След това се заменя във вложения StackPanel, където се създава ресурс със същото име. Различни бутони могат да препращат към ресурс с име toShare и да получават различни стойности в зависимост от това къде се намират в дървото (Фигура 6.1):
1. Йерархия на елементите.
4. Системна тема.
В глава 2 разгледахме обекта Application. Има и имота
Ресурси, което ви позволява да дефинирате ресурси, които са глобални зана цялото приложение:
Тази техника ви позволява да създавате ресурси, които са общи за всички страници, прозорци и контроли. На всяко ниво на приложение можете да замените глобалната стойност на даден ресурс; вече видяхме как става това. Като цяло се препоръчва да се дефинира ресурс на възможно най-ниското ниво. Ако определен ресурс се използва само в един панел, то за този панел той трябва да бъде дефиниран. Ако ресурсът се използва в няколко прозореца, той трябва да бъде дефиниран на ниво приложение. Когато дефинирате ресурс, важно е да запомните, че той може да се използва на много различни места. Тъй като всеки WPF елемент може да присъства само на едно място в дървото на дисплея, не можем надеждно да използваме елемент като ресурс:
В Глава 3 научихме как да използваме класа FrameworkElementFactory, когато даден ресурс трябва да се използва повече от веднъж. За елементи, които принадлежат към шаблони, ние създаваме фабрика, а не самите елементи. Повечето визуални обекти (четки, химикалки, решетки и т.н.) не се нуждаят от фабрика, тъй като повторното използване се осигурява от класа Freezable3.
Може би се чудите: „Защо той изведнъж започна да говори за ресурси в главата за обвързване на данни?“ Въпросът е, че като използваме препратки към статични ресурси, ние по същество правим присвояване на променлива, както в горния C# фрагмент. Когато се използва тази променлива, няма връзка с оригиналната променлива. Разгледайте следния код:
BrushsomeBrush = Четки.Червено; Бутон бутон1 = нов бутон(); button1.Background = someBrush; someBrush = Четки.Жълто;
// button1. Тук фонът ще бъде червен
Когато работите с ресурси, можете или да извършите подобна статична връзка
обадете се във форматазадачи или организирайте динамично обвързване:
Тъй като този път използваме динамично обвързване, можем да променим цвета на бутона, като присвоим нова стойност на свойството Resources на прозореца:
3 Обекта от класа Freezable поддържат споделяне поради режима на "замразяване", в който не могат да бъдат променяни. Режимът на замразяване позволява на множество обекти да споделят едно и също копие, без да се притеснявате дали е било модифицирано от някой друг.
Това е много полезен механизъм. В комбинация с йерархичен ресурсен обхват, той ви позволява да актуализирате всички прозорци или страници на вашето приложение наведнъж. За динамично програмно обвързване на ресурс се нуждаем от метода FrameworkElement.SetResourceReference:
Разбира се, такива динамични връзки не са без допълнителни разходи, тъй като системата трябва да следи промените в ресурса. При проектирането на модела на ресурсите искахме да създадем механизъм, който може да се използва широко в цялата система за откриване на ресурси, без да причинява значителен удар в производителността. Следователно ресурсите са оптимизирани за доста големи промени.
Когато някой ресурс се промени, цялото дърво се актуализира. Следователно статичните и динамичните препратки към ресурси могат да се използват на много места, цената на операцията не зависи от броя на препратките. Но често не трябва да променяте ресурсите, за да актуализирате потребителския интерфейс. Но няма нужда да се притеснявате за голям брой връзки към ресурси.
Ресурсите са специална форма на обвързване на данни, оптимизирана за голям брой обвързвания, които рядко се актуализират. В общия случай механизмът за свързване на данни е оптимизиран, като се предполага умерен брой свързвания (включително двупосочни свързвания) с високачестота на актуализиране. Този по-общ тип обвързване получи и по-просто име; в WPF се нарича простообвързванеилиобвързване.
Източник: K. Anderson Fundamentals of the Windows Presentation Foundation. пер. от английски. А. Слинкина - М .: DMK Press, 2008 - 432 с.: ил.