Поделиться через


Ресурсы и код

В этом обзоре основное внимание уделяется доступу к ресурсам 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");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Альтернативным способом назначения ссылки на ресурсы является 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.

См. также