FontSize="20" Background="{DynamicResource myBrush}"/>
Мастер создания ресурсов определил новый ресурс как динамический (Dynamic Resource
StaticResource): FontSize="20" Background="{StaticResource myBrush}"/>
Чтобы оценить преимущества, модифицируйте свойство Background
StaticResource, после чего можно будет видеть повторное использование в действии: FontSize="20" Background="{StaticResource myBrush}"/>
Расширение разметки {StaticResource}
Расширение разметки {StaticResource}
Brush, например, элемент управления не обновится. Чтобы взглянуть на такое поведение в действии, добавьте свойство Name и обработчик события Click к каждому элементу управления Button: FontSize="20" Background="{StaticResource myBrush}" Click="Ok_OnClick"/>
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
FontSize="20" Background="{DynamicResource
На этот раз в результате щелчка на кнопке Cancel
цвет фона для кнопки Cancel изменяется, а цвет фона для кнопки ОК остается прежним. Причина в том, что расширение разметки{DynamicResource} способно обнаруживать замену внутреннего объекта, указанного посредством ключа, новым объектом. Как и можно было предположить, такая возможность требует дополнительной инфраструктуры времени выполнения, так что {StaticResource} обычно следует использовать, только если не планируется заменять объектный ресурс другим объектом во время выполнения с уведомлением всех элементов, которые задействуют данный ресурс.Ресурсы уровня приложения
Когда в словаре ресурсов окна имеются объектные ресурсы, их могут потреблять все элементы этого окна, но не другие окна приложения. Решение совместно использовать объектные ресурсы в рамках приложения предусматривает их определение на уровне приложения, а не на уровне какого-то окна. В Visual Studio отсутствуют способы автоматизации такого действия, а потому необходимо просто вырезать имеющееся определение объекта кисти из области Windows.Resource
Application.Resources файла Арр.xaml.Теперь любое дополнительное окно или элемент управления в приложении в состоянии работать с данным объектом кисти. Ресурсы уровня приложения доступны для выбора при установке свойства Background