{StaticResource} 标记扩展

通过评估对已定义资源的引用,为任何 XAML 属性提供值。 资源在 ResourceDictionary定义,StaticResource 用法引用 ResourceDictionary该资源的键。

XAML 属性使用方法

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

XAML 值

术语 说明
所请求资源的密钥。 此密钥最初由 ResourceDictionary 分配。 资源键可以是以 XamlName 语法定义的任何字符串。

注解

StaticResource 是一种用于获取 XAML 属性的值的技术,该属性在 XAML 资源字典中的其他位置定义。 值可能放置在资源字典中,因为它们旨在由多个属性值共享,或者因为 XAML 资源字典用作 XAML 打包或分解技术。 XAML 打包技术的示例是控件的主题字典。 另一个示例是用于资源回退的合并资源字典。

StaticResource 采用一个参数,该参数指定所请求资源的密钥。 资源键始终是Windows 运行时 XAML 中的字符串。 有关如何最初指定资源密钥的详细信息,请参阅 x:Key 属性

本主题未介绍 StaticResource 解析为资源字典中的项的规则。 这取决于引用和资源是否都存在于模板中、是否使用合并资源字典等。 有关如何定义资源并正确使用 ResourceDictionary(包括示例代码)的详细信息,请参阅 ResourceDictionary 和 XAML 资源引用

重要提示 StaticResource 不应尝试将引用转发到一个在 XAML 文件中按词法进一步定义的资源。 不支持尝试这样做。 即使前向引用没有失败,也尝试使一个引用会受到性能损失。 为获得最佳结果,请调整资源字典的构成,以避免转发引用。

尝试将 StaticResource 指定为无法在运行时引发 XAML 分析异常的键。 设计工具也可能提供警告或错误。

在Windows 运行时 XAML 处理器实现中,StaticResource 功能没有支持类表示形式StaticResource 专门用于 XAML。 代码中最接近的等效项是使用 ResourceDictionary集合 API,例如调用 ContainsTryGetValue

{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 在 XAML 页面中使用 {StaticResource} 标记扩展时,可以在 Microsoft IntelliSense 下拉列表中包含可能的键值。 例如,键入“{StaticResource”后,当前查找范围中的任何资源键就会显示在 IntelliSense 下拉列表中。 除了在页面级别(FrameworkElement.Resources)和应用级别(Application.Resources)上拥有的典型资源,还会看到 XAML 主题资源以及项目正在使用的任何扩展中的资源。

资源键作为任何 {StaticResource} 用法的一部分存在后, Go To Definition (F12) 功能可以解析该资源,并向你显示定义资源的字典。 对于主题资源,这将转到 generic.xaml 进行设计。