Расширение разметки {StaticResource}
Предоставляет значение для любого атрибута XAML, оценивая ссылку на уже определенный ресурс. Ресурсы определяются в ResourceDictionary, а использование StaticResource ссылается на ключ этого ресурса в ResourceDictionary.
Использование атрибутов XAML
<object property="{StaticResource key}" .../>
Значения XAML
Срок | Description |
---|---|
ключ | Ключ для запрашиваемого ресурса. Этот ключ изначально назначается ResourceDictionary. Ключом ресурса может быть любая строка, определенная в грамматике XamlName. |
Замечания
StaticResource — это метод получения значений для атрибута XAML, определенного в другом месте словаря ресурсов XAML. Значения могут быть помещены в словарь ресурсов, так как они предназначены для совместного использования несколькими значениями свойств или из-за того, что словарь ресурсов XAML используется в качестве метода упаковки или факторинга XAML. Примером метода упаковки XAML является словарь тем для элемента управления. Другим примером является объединенный словарь ресурсов, используемый для резервного размещения ресурсов.
StaticResource принимает один аргумент, указывающий ключ для запрошенного ресурса. Ключ ресурса всегда является строкой в среда выполнения Windows XAML. Дополнительные сведения о первоначальном указании ключа ресурса см. в атрибуте x:Key.
Правила, с помощью которых статическийresource разрешает элемент в словаре ресурсов, не описаны в этом разделе. Это зависит от того, существуют ли ссылки и ресурс в шаблоне, используются ли объединенные словари ресурсов и т. д. Дополнительные сведения о том, как определить ресурсы и правильно использовать ResourceDictionary, включая пример кода, см. в справочниках по ресурсам ResourceDictionary и XAML.
Важное значение StaticResource не должно пытаться выполнить переадресацию ссылки на ресурс, определенный лексически в XAML-файле. Попытка сделать это не поддерживается. Даже если ссылка вперед не завершается неудачей, пытаясь сделать один несет штраф производительности. Для получения наилучших результатов настройте состав словарей ресурсов, чтобы избежать перенаправления ссылок.
Попытка указать статическийresource ключ, который не может разрешить исключение синтаксического анализа 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} , функция Go To Definition (F12) может разрешить этот ресурс и показать словарь, в котором он определен. Для ресурсов темы это относится к generic.xaml для времени разработки.