Partilhar via


Recursos em código (WPF .NET)

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 de sintaxe XAML. Para obter mais informações sobre o uso geral de recursos e recursos de uma perspectiva de sintaxe XAML, consulte Visão geral dos recursos XAML.

Acessando recursos do código

As chaves que identificam recursos definidos por 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 FindResource método ou o TryFindResource método de objetos no nível da 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 retorna null. Cada método usa a chave do recurso como um parâmetro de entrada e retorna um objeto que não é fortemente tipado.

Normalmente, uma chave de recurso é uma cadeia de caracteres, mas há usos ocasionais que não são de cadeia de caracteres. A lógica de pesquisa para resolução de recursos de código é a mesma que o caso XAML de referência de recurso dinâmico. A pesquisa de recursos começa no elemento de chamada e, em seguida, continua por meio de elementos pai na árvore lógica. A pesquisa segue adiante para os recursos de aplicativo, temas e recursos de sistema, se necessário. Uma solicitação de código para um recurso levará em conta corretamente as alterações nesses recursos que ocorreram durante o runtime.

O exemplo de código a seguir demonstra um manipulador de Click eventos que localiza um recurso por chave e usa o valor retornado para definir uma propriedade.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(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, esse método é igual e tem a vantagem de não exigir nenhuma conversão de valores retornados.

Ainda outra maneira de acessar recursos programaticamente é acessar o conteúdo da Resources propriedade como um dicionário. Os dicionários de recursos são usados para adicionar novos recursos a coleções existentes, verificar se um determinado nome de chave já está sendo usado pela coleção e outras operações. Se você estiver escrevendo um aplicativo WPF inteiramente em código, também poderá criar toda a coleção em código, atribuir recursos a ela. A coleção pode então ser atribuída à Resources propriedade de um elemento. Isso é descrito na próxima seção.

Você pode indexar em qualquer Resources coleção, usando uma chave específica como índice. Os recursos acessados dessa maneira não seguem as regras normais de runtime de resolução de recursos. Você está acessando apenas essa coleção específica. A pesquisa de recursos não percorre o escopo do recurso para a raiz ou o aplicativo se nenhum objeto válido foi encontrado na chave solicitada. No entanto, essa abordagem pode ter vantagens de desempenho em alguns casos, precisamente porque o escopo da pesquisa no caso da chave é mais restrito. Para obter mais informações sobre como trabalhar diretamente com um dicionário de recursos, consulte a ResourceDictionary classe.

Criando recursos com código

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

Usando objetos como chaves

A maioria dos usos do recurso definirá a chave de recurso como uma cadeia de caracteres. No entanto, vários recursos do WPF usam deliberadamente o tipo de objeto como uma chave em vez de uma cadeia de caracteres. A capacidade de fazer com que o recurso seja chaveado por um tipo de objeto é usada pelo estilo WPF e pelo suporte a temas. Os estilos e temas que se tornam o padrão para um controle sem estilo são codificados pelo Type controle ao qual devem ser aplicados.

Ser chaveado por tipo fornece um mecanismo de pesquisa confiável que funciona em instâncias padrão de cada tipo de controle. O tipo pode ser detectado por reflexão e usado para estilizar classes derivadas, mesmo que o tipo derivado não tenha nenhum estilo padrão. Você pode especificar uma Type chave para um recurso definido em XAML usando a extensão de marcação x:Type. Existem extensões semelhantes para outros usos de chave que não são de cadeia de caracteres que dão suporte a recursos do WPF, como ComponentResourceKey Markup Extension.

Para obter mais informações, consulte Estilos, DataTemplates e chaves implícitas.

Confira também