Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

<Button Margin="25" Height="200" Width="200" Content="OK"

FontSize="20" Background="{DynamicResource myBrush}"/>

Мастер создания ресурсов определил новый ресурс как динамический (

Dynamic Resource
). Динамические ресурсы рассматриваются позже, а пока поменяйте тип ресурса на статический (
StaticResource
):

<Button Margin="25" Height="200" Width="200" Content="OK"

FontSize="20" Background="{StaticResource myBrush}"/>

Чтобы

оценить преимущества, модифицируйте свойство
Background
кнопки Cancel (Отмена), указав в нем тот же самый ресурс
StaticResource
, после чего можно будет видеть повторное использование в действии:

<Button Margin="25" Height="200" Width="200" Content="Cancel"

FontSize="20" Background="{StaticResource myBrush}"/>

Расширение разметки {StaticResource}

Расширение разметки

{StaticResource}
применяет ресурс только один раз (при инициализации) ион остается "подключенным" к первоначальному объекту на протяжении всей времени жизни приложения. Некоторые свойства (вроде градиентных переходов) будут обновляться, но в случае создания нового элемента
Brush
, например, элемент управления не обновится. Чтобы взглянуть на такое поведение в действии, добавьте свойство
Name
и обработчик события
Click
к каждому элементу управления
Button
:

<Button Name="Ok" Margin="25" Height="200" Width="200" Content="OK"

FontSize="20" Background="{StaticResource myBrush}" Click="Ok_OnClick"/>

<Button Name="Cancel" Margin="25" Height="200" Width="200" Content="Cancel"

FontSize="20" Background="{StaticResource myBrush}" Click="Cancel_OnClick"/>

Затем поместите в обработчик события

Ok_OnClick
следующий код:

private void Ok_OnClick(object sender, RoutedEventArgs e)

{

// Получить кисть и внести изменение.

var b=(RadialGradientBrush)Resources["myBrush"];

b.GradientStops[1]=new GradientStop(Colors.Black, 0.0);

}

На заметку! Здесь для поиска ресурса по имени используется индексатор

Resources
. Тем не менее, имейте в виду, что если ресурс найти не удастся, тогда будет сгенерировано исключение времени выполнения. Можно также применять метод
TryFindResource
, который не приводит к генерации исключения, а просто возвращает
null
, если указанный ресурс не найден.

Запустив программу и щелкнув на кнопке ОК, вы заметите,что градиенты соответствующим образом изменяются. Добавьте в обработчик события

Cancel_OnClick
такой код:

private void Cancel_OnClick(object sender, RoutedEventArgs e)

{

// Поместить в ячейку myBrush совершенно новую кисть.

Resources["myBrush"]=new SolidColorBrush(Colors.Red);

}

Снова

запустив программу и щелкнув на кнопке Cancel, вы обнаружите, что ничего не происходит!

Расширение разметки {DynamicResource}

Для свойства также можно использовать расширение разметки

DynamicResource
. Чтобы выяснить разницу, измените разметку для кнопки Cancel, как показано ниже:

<Button Name="Cancel" Margin="25" Height="200" Width="200" Content="Cancel"

FontSize="20" Background="{DynamicResource myBrush}" Click="Cancel_OnClick"/>

На этот раз в результате щелчка на кнопке Cancel цвет фона для кнопки Cancel изменяется, а цвет фона для кнопки ОК остается прежним. Причина в том, что расширение разметки

{DynamicResource}
способно обнаруживать замену внутреннего объекта, указанного посредством ключа, новым объектом. Как и можно было предположить, такая возможность требует дополнительной инфраструктуры времени выполнения, так что
{StaticResource}
обычно следует использовать, только если не планируется заменять объектный ресурс другим объектом во время выполнения с уведомлением всех элементов, которые задействуют данный ресурс.

Ресурсы уровня приложения

Когда в словаре ресурсов окна имеются объектные ресурсы, их могут потреблять все элементы этого окна, но не другие окна приложения. Решение совместно использовать объектные ресурсы в рамках приложения предусматривает их определение на уровне приложения, а не на уровне какого-то окна. В Visual Studio отсутствуют способы автоматизации такого действия, а потому необходимо просто вырезать имеющееся определение объекта кисти из области

Windows.Resource
и поместить его в область
Application.Resources
файла
Арр.xaml
.

Теперь любое дополнительное окно или элемент управления в приложении в состоянии работать с данным объектом кисти. Ресурсы уровня приложения доступны для выбора при установке свойства

Background
элемента управления (рис. 27.5).

На заметку! Помещение ресурса на уровень приложения и назначение его свойству элемента управления приводит к замораживанию ресурса, что препятствует изменению значений во время выполнения. Ресурс можно клонировать и модифицировать клон.

Определение объединенных словарей ресурсов

Ресурсов уровня приложения часто оказывается вполне достаточно, но они ничем не помогут, если ресурсы необходимо разделять между проектами. В таком случае понадобится определить то, что известно как объединенный словарь ресурсов. Считайте его библиотекой классов для ресурсов WPF; он представляет собой всего лишь файл

.xaml
, содержащий коллекцию ресурсов. Единственный проект может иметь любое требуемое количество таких файлов (один для кистей, один для анимации и т.д.), каждый из которых может быть добавлен в диалоговом окне Add New Item (Добавление нового элемента), открываемом через меню Project (рис. 27.6).

Поделиться с друзьями: