Ресурсы и код
Этот обзор посвящен преимущественно доступу к ресурсам Windows Presentation Foundation (WPF) и их созданию с использованием кода, а не синтаксиса XAML. Дополнительные сведения об общем использовании ресурсов и ресурсах с точки зрения синтаксиса XAML см. в разделе Ресурсы XAML.
Доступ к ресурсам из кода
Ключи, идентифицирующие ресурсы, если они определены через XAML, также используются для извлечения определенных ресурсов при запросе ресурса из кода. Самый простой способ извлечения ресурса из кода является вызов либо FindResource или TryFindResource метода из объектов уровня среды приложения. Различие между этими методами проявляется, если запрошенный ключ не найден. FindResource приводит к появлению исключения; TryFindResource не вызовут исключения, но возвращает null
. Каждый из этих методов принимает ключ ресурса в качестве входного параметра и возвращает объект со слабой типизацией. Как правило, ключ ресурса является строкой, но иногда используются и нестроковые ключи. Подробнее см. в разделе Использование объектов в качестве ключей. Как правило, возвращаемый объект приводится к типу, необходимому для свойства, которое устанавливается при запросе ресурса. Логика поиска разрешения ресурса кода такая же, как и в случае динамической ссылки на ресурс XAML. Поиск ресурсов начинается с вызывающего элемента, затем продолжается в последовательных родительских элементах в логическом дереве. При необходимости поиск продолжается в ресурсах приложений, темах и системных ресурсах. Запрос кода для ресурса будет правильно учитывать изменения во время выполнения в словарях ресурсов, которые могли быть сделаны после загрузки данного словаря из XAML, а также изменения системных ресурсов в реальном времени.
Ниже приведен пример кода, который находит ресурс по ключу и использует возвращаемое значение, чтобы задать свойство, реализованы в виде Click обработчик событий.
void SetBGByResource(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.Background = (Brush)this.FindResource("RainbowBrush");
}
Альтернативный метод для назначения является ссылкой на ресурс является SetResourceReference. Этот метод принимает два параметра — ключ ресурса и идентификатор конкретного свойства зависимостей из экземпляра элемента, которому должно быть присвоено значение ресурса. Функционально этот метод аналогичен, но имеет преимущество в том плане, что не требует приведения возвращаемых значений.
Еще одним способом программного доступа к ресурсам является доступ к содержимому Resources свойство как словарь. Доступ к словарю, содержащемуся в этом свойстве, включает добавление новых ресурсов в существующие коллекции, проверку оригинальности имени ключа в коллекции, а также другие операции со словарем/коллекцией. Если вы создаете WPF приложения полностью в коде, можно также создать всю коллекцию в коде, присвоить ей ключи и затем присвоить законченную коллекцию для Resources свойство установленного элемента. Это будет описано в следующем разделе.
Можно индексировать любую заданную Resources коллекцию, используя указанный ключ индекса, но следует иметь в виду, что доступ к ресурсу таким образом не соответствует обычным правилам времени выполнения для разрешения ресурса. У вас будет только доступ к этой конкретной коллекции. Поиск ресурсов не будет пересекать область действия корня или приложения, если в запрашиваемом ключе не найден действительный объект. Тем не менее в некоторых случаях этот подход может иметь преимущество в производительности, поскольку область поиска ключа более ограничена. См. в разделе ResourceDictionary Дополнительные сведения о том, как работать со словарями ресурсов напрямую.
Создание ресурсов с помощью кода
Пи создании приложения WPF полностью в коде может также понадобиться создать в коде все ресурсы в этом приложении. Чтобы добиться этого, создайте новый ResourceDictionary экземпляра, а затем добавьте все ресурсы в словарь, с помощью последовательных вызовов ResourceDictionary.Add. Затем с помощью ResourceDictionary созданный таким образом, чтобы задать Resources свойство на элементе, который присутствует в области страницы, или Application.Resources. Можно также хранить ResourceDictionary как с автономным объектом, не добавляя ее к элементу. Однако в этом случае для доступа к ресурсам внутри него потребуется ключ элемента, как для общего словаря. Объект ResourceDictionary , не присоединенные к элементу Resources
свойство не будет существовать как часть дерева элементов и не имел бы области в последовательности поиска, которая может использоваться FindResource и связанными методами.
Использование объектов в качестве ключей
В большинстве случаев использования ресурса ключ ресурса устанавливается в виде строки. Однако различные функции WPF намеренно не используют строковый тип для указания ключей, вместо этого параметр является объектом. Возможность доступа объекта к ресурсу по ключу используется в поддержке стилей и тем WPF. Стили в темах, которые становятся стилем по умолчанию для элемента управления без стиля по ключу с Type элемента управления, они должны применяться. Ввод с помощью ключа по типу обеспечивает надежный механизм поиска, который работает со стандартными экземплярами каждого типа элемента управления, а тип может быть обнаружен отражением и использоваться для создания стилей производных классов, даже если у производного типа нет стиля по умолчанию. Можно указать Type ключей для ресурса, определенного в XAML с помощью расширение разметки x: Type. Аналогичные расширения существуют для других случаев использования нестрокового ключа, поддерживающих функции WPF, такие как Расширение разметки ComponentResourceKey.