Extensão de marcação {StaticResource}
Fornece um valor para qualquer atributo XAML avaliando uma referência a um recurso já definido. Os recursos são definidos em um ResourceDictionary e um uso de StaticResource faz referência à chave desse recurso no ResourceDictionary.
Uso do atributo XAML
<object property="{StaticResource key}" .../>
Valores XAML
Termo | Descrição |
---|---|
chave | A chave para o recurso solicitado. Essa chave é inicialmente atribuída pelo ResourceDictionary. Uma tecla de recurso pode ser qualquer cadeia de caracteres definida na Gramática XamlName. |
Comentários
StaticResource é uma técnica para obter valores para um atributo XAML que são definidos em outro lugar em um dicionário de recursos XAML. Os valores podem ser colocados em um dicionário de recursos porque devem ser compartilhados por vários valores de propriedade ou porque um dicionário de recursos XAML é usado como uma técnica de empacotamento ou fatoração XAML. Um exemplo de uma técnica de empacotamento XAML é o dicionário de temas para um controle. Outro exemplo são os dicionários de recursos mesclados usados para fallback de recursos.
StaticResource usa um argumento, que especifica a chave para o recurso solicitado. Uma chave de recurso é sempre uma cadeia de caracteres no XAML do Tempo de Execução do Windows. Para obter mais informações sobre como a chave de recurso é especificada inicialmente, consulte o atributo x:Key.
As regras pelas quais um StaticResource é resolvido para um item em um dicionário de recursos não são descritas neste tópico. Isso depende se a referência e o recurso existem em um modelo, se dicionários de recursos mesclados são usados e assim por diante. Para obter mais informações sobre como definir recursos e usar corretamente um ResourceDictionary, incluindo código de exemplo, consulte Referências de recursos ResourceDictionary e XAML.
Importante Um StaticResource não deve tentar fazer uma referência direta a um recurso que é definido lexicalmente mais detalhadamente no arquivo XAML. Não há suporte para a tentativa de fazer isso. Mesmo que a referência direta não falhe, tentar fazer uma acarreta uma penalidade de desempenho. Para obter melhores resultados, ajuste a composição de seus dicionários de recursos para que as referências diretas sejam evitadas.
A tentativa de especificar um StaticResource para uma chave que não pode ser resolvida gera uma exceção de análise XAML em tempo de execução. As ferramentas de design também podem oferecer avisos ou erros.
Na implementação do processador XAML do Tempo de Execução do Windows, não há representação de classe de suporte para a funcionalidade StaticResource . StaticResource é exclusivamente para uso em XAML. O equivalente mais próximo no código é usar a API de coleção de um ResourceDictionary, por exemplo, chamando Contains ou TryGetValue.
A extensão de marcação {ThemeResource} é uma extensão de marcação semelhante que faz referência a recursos nomeados em outro local. A diferença é que a extensão de marcação {ThemeResource} tem a capacidade de retornar recursos diferentes, dependendo do tema do sistema ativo. Para obter mais informações, consulte a extensão de marcação {ThemeResource}.
StaticResource é uma extensão de marcação. Extensões de marcação são tipicamente implementadas quando existe um requisito que permite que valores de atributo sejam diferentes de valores literais ou nomes de manipuladores, e o requisito é mais global do que simplesmente colocar conversores de tipo em certos tipos ou propriedades. Todas as extensões de marcação em XAML usam os caracteres "{" e "}" em sua sintaxe de atributo, que é a convenção pela qual um processador XAML reconhece que uma extensão de marcação deve processar o atributo.
Um exemplo de uso de {StaticResource}
Este exemplo de XAML é obtido do exemplo de associação de dados 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>
Este exemplo específico cria um objeto que é apoiado por uma classe personalizada e o cria como um recurso em um ResourceDictionary. Para ser um recurso válido, esse local:S2Formatter
elemento também deve ter um valor de atributo x:Key . O valor do atributo é definido como "GradeConverter".
O recurso é solicitado um pouco mais adiante no XAML, onde você vê {StaticResource GradeConverter}
.
Observe como o uso da extensão de marcação {StaticResource} está definindo uma propriedade de outra extensão de marcação {Binding} extensão de marcação, portanto, há dois usos de extensão de marcação aninhados aqui. O interno é avaliado primeiro, para que o recurso seja obtido primeiro e possa ser usado como um valor. Esse mesmo exemplo também é mostrado na extensão de marcação {Binding}.
Suporte a ferramentas de tempo de design para a extensão de marcação {StaticResource}
O Microsoft Visual Studio 2013 pode incluir possíveis valores de chave nas listas suspensas do Microsoft IntelliSense quando você usa a extensão de marcação {StaticResource} em uma página XAML. Por exemplo, assim que você digitar "{StaticResource", qualquer uma das chaves de recurso do escopo de pesquisa atual será exibida nas listas suspensas do IntelliSense. Além dos recursos típicos que você teria no nível da página (FrameworkElement.Resources) e no nível do aplicativo (Application.Resources), você também verá recursos de tema XAML e recursos de todas as extensões que seu projeto está usando.
Depois que uma chave de recurso existe como parte de qualquer uso de {StaticResource} , o recurso Ir para Definição (F12) pode resolver esse recurso e mostrar o dicionário em que ele está definido. Para os recursos do tema, isso vai para generic.xaml para o tempo de design.