Язык программирования C#9 и платформа .NET5
Будет запрошено имя ресурса (
) и предложено указать, куда он должен быть помещен. Оставьте отмеченным переключатель This document (Этот документ), который выбирается по умолчанию (рис. 27.4).myBrushВ результате определение кисти переместится внутрь дескриптора
.WindowResources:<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}"/>Чтобы оценить преимущества, модифицируйте свойство
кнопки Cancel (Отмена), указав в нем тот же самый ресурсBackground, после чего можно будет видеть повторное использование в действии: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}
Для свойства также можно использовать расширение разметки
. Чтобы выяснить разницу, измените разметку для кнопки Cancel, как показано ниже:DynamicResource<Button Name="Cancel" Margin="25" Height="200" Width="200" Content="Cancel"FontSize="20" Background="{<b>DynamicResource</b> myBrush}" Click="Cancel_OnClick"/>

