Будет запрошено имя ресурса (myBrush) и предложено указать, куда он должен быть помещен. Оставьте отмеченным переключатель This document (Этот документ), который выбирается по умолчанию (рис. 27.4).
В результате определение кисти переместится внутрь дескриптора Window.
Resources:
<Window.Resources>
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="#FFC44EC4" Offset="0" />
<GradientStop Color="#FF829CEB" Offset="1" />
<GradientStop Color="#FF793879" Offset="0.669" />
</RadialGradientBrush>
</Window.Resources>
Свойство Background элемента управления Button обновляется для работы с новым ресурсом:
<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:
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
<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="{<b>DynamicResource</b> myBrush}" Click="Cancel_OnClick"/>