Расширение разметки {StaticResource}

Предоставляет значение для любого атрибута языка XAML путем оценки ссылки на уже определенный ресурс. Ресурсы определены в ResourceDictionary, а использование StaticResource определяет ссылку на ключ ресурса в ResourceDictionary.

Использование атрибутов XAML

<object property="{StaticResource key}" .../>

Значения XAML

Термин Описание
ключ Ключ для запрашиваемого ресурса. Изначально ключ назначается атрибутом ResourceDictionary. Ключом ресурса может быть любая строка, определенная в грамматике XamlName.

Комментарии

StaticResource — это метод получения для атрибута XAML значений, которые определены где-либо в словаре ресурсов XAML. Эти значения могут быть добавлены в словарь ресурсов, так как они предназначены для использования несколькими значениями свойств; либо потому, что словарь ресурсов XAML используется как упаковка языка XAML или как метод разложения на элементарные операции. Примером метода упаковки XAML является словарь тем для элемента управления. Другим примером являются объединенные словари ресурсов, применяемые для резервирования ресурсов.

StaticResource принимает один аргумент, в котором задается ключ для запрашиваемого ресурса. Ключ ресурса всегда является строкой XAML в среде выполнения Windows. Дополнительные сведения о том, как изначально задается ключ ресурса, см. в разделе Атрибут x:Key.

Правила, по которым StaticResource разрешается в элемент в словаре ресурсов, в этом разделе не описываются. Это зависит от наличия ссылки и ресурса в шаблоне, от применения объединенных словарей ресурсов и т. д. Дополнительные сведения о том, как определять ресурсы и правильно использовать ResourceDictionary, включая образец кода, см. в разделе Ссылки ResourceDictionary и XAML.

ВажноStaticResource не должен пытаться сделать прямую ссылку на ресурс, который определен лексически далее в XAML-файле. Создание таких ссылок не поддерживается. Даже если опережающая ссылка не вызовет ошибку, ее создание приведет к снижению производительности. Для достижения наилучших результатов составляйте словари ресурсов так, чтобы обходиться без опережающих ссылок.

Если задать в StaticResource ключ, который не удается разрешить, то во время выполнения создается исключение синтаксического анализа XAML. Средства разработки также могут выдавать предупреждения и ошибки.

В реализации процессора XAML в среде выполнения Windows отсутствует представление класса резервирования для функций StaticResource. Расширение StaticResource предназначено исключительно для использования в XAML. Наиболее близким аналогом в коде является использование API из коллекции ResourceDictionary, например вызов Contains или TryGetValue.

Расширение разметки {ThemeResource} представляет собой аналогичное расширение разметки, которое ссылается на указанные ресурсы с другим расположением. Разница в том, что расширение разметки {ThemeResource} может возвращать различные ресурсы в зависимости от активной системной темы. Подробнее см. в разделе Расширение разметки {ThemeResource}.

StaticResource является расширением разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется больше, чем простая настройка преобразователей типов на работу с определенными типами или свойствами. Для всех расширений разметки в XAML в синтаксисе атрибутов используются символы "{" и "}". Это соответствует соглашению, по которому процессор XAML распознает, что расширение разметки должно обработать атрибут.

Пример использования {StaticResource}

Этот образец XAML взят из образца привязки данных XAML.

<StackPanel Margin="5">
    <!-- Add converter as a resource to reference it from a Binding. --> 
    <StackPanel.Resources>
        <local:S2Formatter x:Key="GradeConverter"/>
    </StackPanel.Resources>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Percent grade:" Margin="5" />
    <Slider x:Name="sliderValueConverter" Minimum="1" Maximum="100" Value="70" Margin="5"/>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Letter grade:" Margin="5"/>
    <TextBox x:Name="tbValueConverterDataBound"
      Text="{Binding ElementName=sliderValueConverter, Path=Value, Mode=OneWay,  
        Converter={StaticResource GradeConverter}}" Margin="5" Width="150"/> 
</StackPanel> 

В этом конкретном примере создается объект, подкрепленный пользовательским классом, причем объект создается как ресурс в ResourceDictionary. Чтобы стать действительным ресурсом, этот элемент local:S2Formatter должен также иметь значение атрибута x:Key. Значением атрибута является GradeConverter.

Затем ресурс запрашивается чуть дальше в коде XAML, где вы видите {StaticResource GradeConverter}.

Обратите внимание, как использование расширения разметки {StaticResource} задает свойство другого расширения разметки {Binding}. Таким образом, здесь использованы два вложенных расширения разметки. Внутренний сегмент вычисляется первым, то есть сначала определяется ресурс, который затем можно использовать в качестве значения. Этот же пример показан в разделе "Расширение разметки {Binding}".

Поддержка средств разработки для расширения разметки {StaticResource}

Пакет Microsoft Visual Studio 2013 может содержать возможные значения ключей в раскрывающихся меню Microsoft IntelliSense при использовании расширения разметки {StaticResource} на XAML-странице. Например, когда вы вводите {StaticResource, в раскрывающемся списке IntelliSense появляются все ключи ресурса из текущей области подстановки. Помимо типичных ресурсов, присутствующих на уровне страницы (FrameworkElement.Resources) и уровне приложения (Application.Resources), также отображаются ресурсы темы XAML и ресурсы из всех расширений, используемых в проекте.

Если при использовании {StaticResource} обнаруживается ключ ресурса, функция Перейти к определению (F12) может разрешить ресурс и показать словарь, в котором он определен. Для ресурсов темы во время разработки эта функция ведет к файлу generic.xaml.