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


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

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

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

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

Значения XAML

Срок Description
key Ключ запрошенного ресурса. Этот ключ изначально назначается 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 может включать возможные ключевые значения в раскрывающиеся списки Microsoft IntelliSense при использовании расширения разметки {StaticResource} на странице XAML. Например, как только вы вводите "{StaticResource", любой из ключей ресурсов из текущей области поиска отображается в списках подсказок IntelliSense. Помимо типичных ресурсов, которые у вас есть на уровне страницы (FrameworkElement.Resources) и на уровне приложения (Application.Resources), вы также увидите ресурсы темы XAML и ресурсы из любых расширений, которые использует проект.

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