Ресурсы в коде (WPF .NET)

В этом обзоре основное внимание уделяется доступу к ресурсам Windows Presentation Foundation (WPF) или созданию с помощью кода, а не синтаксиса XAML. Дополнительные сведения об общем использовании ресурсов и ресурсах с точки зрения синтаксиса XAML см. в обзоре ресурсов XAML.

Доступ к ресурсам из кода

Ключи, определяющие определенные ресурсы XAML, также используются для получения определенных ресурсов при запросе ресурса в коде. Самым простым способом извлечения ресурса из кода является вызов метода FindResource или TryFindResource из объектов уровня платформы в приложении. Разница в поведении между этими методами заключается в том, что происходит, если запрошенный ключ не найден. FindResource вызывает исключение. TryFindResourceне вызывает исключение, но возвращает.null Каждый из этих методов принимает ключ ресурса в качестве входного параметра и возвращает объект со слабой типизацией.

Как правило, ключ ресурса является строкой, но иногда используются нестроки. Логика поиска разрешения ресурса кода такая же, как и в случае динамической ссылки на ресурс XAML. Поиск ресурсов начинается с вызывающего элемента, а затем продолжается через родительские элементы в логическом дереве. При необходимости поиск продолжается в ресурсах приложений, темах и системных ресурсах. Запрос кода для ресурса будет правильно учитывать изменения этих ресурсов, которые произошли во время выполнения.

В следующем примере кода показан Click обработчик событий, который находит ресурс по ключу и использует возвращаемое значение для задания свойства.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

Альтернативным методом назначения ссылки на ресурс является SetResourceReference. Этот метод принимает два параметра: ключ ресурса и идентификатор определенного свойства зависимостей, присутствующих в экземпляре элемента, которому должно быть назначено значение ресурса. Функционально этот метод аналогичен, но имеет преимущество в том плане, что не требует приведения возвращаемых значений.

Еще одним способом программного доступа к ресурсам является доступ к содержимому свойства Resources как словаря. Словари ресурсов используются для добавления новых ресурсов в существующие коллекции, проверка, чтобы узнать, используется ли данное имя ключа коллекцией и другие операции. Если вы пишете приложение WPF полностью в коде, вы также можете создать всю коллекцию в коде, назначить ресурсы ему. Затем коллекцию можно назначить Resources свойству элемента. Это описано в следующем разделе.

Вы можете индексировать в любой данной Resources коллекции, используя определенный ключ в качестве индекса. Доступ к ресурсам таким образом не соответствует обычным правилам среды выполнения разрешения ресурсов. Вы обращаетесь только к этой конкретной коллекции. Поиск ресурсов не проходит по ресурсу область корню или приложению, если допустимый объект не найден на запрошенный ключ. Тем не менее в некоторых случаях этот подход может иметь преимущество в производительности, поскольку область поиска ключа более ограничена. Дополнительные сведения о том, как работать с словарем ресурсов напрямую, см. в ResourceDictionary классе.

Создание ресурсов с помощью кода

Пи создании приложения WPF полностью в коде может также понадобиться создать в коде все ресурсы в этом приложении. Для этого создайте новый экземпляр ResourceDictionary, а затем добавьте все ресурсы в словарь с помощью последовательных вызовов в ResourceDictionary.Add. Затем назначьте созданное ResourceDictionaryResources свойство для элемента, который присутствует на странице область или .Application.Resources Можно также работать с ResourceDictionary как с автономным объектом, не добавляя его в элемент. Однако в этом случае для доступа к ресурсам внутри него потребуется ключ элемента, как для общего словаря. ОбъектResourceDictionary, который не присоединен к свойству элементаResources, не существует в составе дерева элементов и не имеет область в последовательности подстановки, которая может использоваться FindResource и связанными методами.

Использование объектов в качестве ключей

В большинстве случаев использования ресурса ключ ресурса устанавливается в виде строки. Однако различные функции WPF намеренно используют тип объекта в качестве ключа вместо строки. Возможность ключа ресурса с помощью типа объекта используется стилем WPF и поддержкой тем. Стили и темы, которые становятся по умолчанию для элемента управления, отличного от стиля, являются ключами Type элемента управления, к которому они должны применяться.

Ключи по типу предоставляют надежный механизм подстановки, который работает на экземплярах по умолчанию каждого типа элемента управления. Тип можно обнаружить отражением и использовать для стилизации производных классов, даже если производный тип в противном случае не имеет стиля по умолчанию. Ключ для ресурса, определенного в XAML, можно указать Type с помощью расширения разметки x:Type. Аналогичные расширения существуют для других нестроковых ключевых использования, поддерживающих функции WPF, такие как расширение разметки ComponentResourceKey.

Дополнительные сведения см. в статье Стили, DataTemplates и неявные ключи.

См. также