Partilhar via


Recursos e Código

Esta visão geral se concentra em como os recursos do Windows Presentation Foundation (WPF) podem ser acessados ou criados usando código em vez da sintaxe XAML (Extensible Application Markup Language). Para obter mais informações sobre o uso geral e os recursos sob a perspetiva da sintaxe XAML, consulte Recursos XAML.

Acessando recursos do código

As chaves que identificam recursos se forem definidas por meio de XAML também são usadas para recuperar recursos específicos se você solicitar o recurso no código. A maneira mais simples de recuperar um recurso do código é chamar o método FindResource ou o método TryFindResource de objetos de nível de estrutura em seu aplicativo. A diferença comportamental entre esses métodos é o que acontece se a chave solicitada não for encontrada. FindResource levanta uma exceção; TryFindResource não levantará uma exceção, mas devolverá null. Cada método usa a chave de recurso como um parâmetro de entrada e retorna um objeto digitado vagamente. Normalmente, uma chave de recurso é uma cadeia de caracteres, mas há usos ocasionais sem cadeia de caracteres; consulte a seção Usando objetos como chaves para obter detalhes. Normalmente, você lançaria o objeto retornado para o tipo exigido pela propriedade que você está definindo ao solicitar o recurso. A lógica de pesquisa para resolução de recursos de código é a mesma que no caso XAML de referência de recurso dinâmico. A busca por recursos começa a partir do elemento chamador e, em seguida, continua para os elementos pai sucessivos na árvore lógica. A pesquisa continua em recursos de aplicativos, temas e recursos do sistema, se necessário. Uma solicitação de código para um recurso levará em conta corretamente as alterações de tempo de execução em dicionários de recursos que possam ter sido feitas subsequentemente ao carregamento desse dicionário de recursos a partir de XAML e também as alterações de recursos do sistema em tempo real.

A seguir está um breve exemplo de código que localiza um recurso por chave e usa o valor retornado para definir uma propriedade, implementada como um manipulador de eventos Click.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Um método alternativo para atribuir uma referência de recurso é SetResourceReference. Esse método usa dois parâmetros: a chave do recurso e o identificador de uma propriedade de dependência específica que está presente na instância do elemento à qual o valor do recurso deve ser atribuído. Funcionalmente, este método é o mesmo e tem a vantagem de não exigir qualquer casting de valores de retorno.

Outra maneira de acessar recursos programaticamente é acessar o conteúdo da propriedade Resources como um dicionário. Acessar o dicionário contido por essa propriedade também é como você pode adicionar novos recursos às coleções existentes, verificar se um determinado nome de chave já está incluído na coleção e outras operações de dicionário/coleção. Se você estiver escrevendo um aplicativo WPF inteiramente em código, você também pode criar toda a coleção em código, atribuir chaves a ele e, em seguida, atribuir a coleção concluída à propriedade Resources de um elemento estabelecido. Isso será descrito na próxima seção.

Você pode indexar dentro de qualquer coleção de Resources, usando uma chave específica como índice, mas deve estar ciente de que acessar o recurso dessa maneira não segue as regras normais de tempo de execução da resolução de recursos. Você está acessando apenas essa coleção específica. A pesquisa de recursos não percorrerá o escopo até a raiz ou o aplicativo se nenhum objeto válido for encontrado na chave solicitada. No entanto, esta abordagem pode ter vantagens de desempenho em alguns casos, precisamente porque o âmbito da procura da chave é mais restrito. Consulte a classe ResourceDictionary para obter mais detalhes sobre como trabalhar diretamente com o dicionário de recursos.

Criando recursos com código

Se você quiser criar um aplicativo WPF inteiro no código, você também pode querer criar quaisquer recursos nesse aplicativo no código. Para conseguir isso, crie uma nova instância de ResourceDictionary e, em seguida, adicione todos os recursos ao dicionário usando chamadas sucessivas para ResourceDictionary.Add. Em seguida, use o ResourceDictionary criado para definir a propriedade Resources num elemento que está presente no âmbito de uma página, ou no Application.Resources. Você também pode manter o ResourceDictionary como um objeto autônomo sem adicioná-lo a um elemento. No entanto, se você fizer isso, você deve acessar os recursos dentro dele por chave de item, como se fosse um dicionário genérico. Um ResourceDictionary que não está anexado à propriedade do elemento Resources não existiria como parte da árvore de elementos e não tem nenhum escopo numa sequência de pesquisa que pode ser utilizada por FindResource e métodos relacionados.

Usando objetos como chaves

A maioria dos usos de recursos definirá a chave do recurso como uma cadeia de caracteres. No entanto, vários recursos do WPF deliberadamente não usam um tipo de cadeia de caracteres para especificar chaves, em vez disso, esse parâmetro é um objeto. A capacidade de ter o recurso associado a um objeto é utilizada pelo estilo WPF e pelo suporte para temas. Os estilos nos temas, que se tornam o estilo padrão para um controlo sem estilo, são cada um identificados pela Type do controlo ao qual devem ser aplicados. Sendo tipificado por tipo proporciona um mecanismo de consulta confiável que opera em instâncias padrão de cada tipo de controle, e o tipo pode ser detetado por reflexão e ser utilizado para definir o estilo de classes derivadas, mesmo que o tipo derivado, por si só, não tenha um estilo padrão. Você pode especificar uma chave Type para um recurso definido em XAML usando o x:Type Markup Extension. Existem extensões semelhantes para outros usos de chave sem cadeia de caracteres que suportam recursos WPF, como ComponentResourceKey Markup Extension.

Ver também