Share 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 da 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 a partir 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 ou o FindResourceTryFindResource método 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 retornará 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 recurso de código é a mesma que o caso XAML de referência de recurso dinâmico. A pesquisa de recursos começa a partir do elemento de chamada e, em seguida, continua através 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 aconteceram durante o tempo de execução.

O exemplo de código a seguir demonstra um manipulador de eventos que localiza um Click 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.

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á é usado pela coleção e outras operações. Se você estiver escrevendo um aplicativo WPF inteiramente em código, você também pode criar toda a coleção em código, atribuir recursos a ele. A coleção pode então ser atribuída à Resources propriedade de um elemento. Isso é descrito na próxima seção.

Você pode indexar dentro de qualquer coleção específica, usando uma chave específica Resources como o índice. Os recursos acessados dessa maneira não seguem as regras normais de tempo de execução da resolução de recursos. Você só está acessando essa coleção específica. A pesquisa de recursos não atravessa o escopo do recurso até 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 em código, você também pode querer criar quaisquer recursos nesse aplicativo em código. Para conseguir 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 criado ResourceDictionary para definir a Resources propriedade em um elemento 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 e 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 ter o recurso sendo chaveado por um tipo de objeto é usada pelo estilo WPF e suporte a temas. Os estilos e temas que se tornam o padrão para um controle sem estilo são cada um digitado Type pelo controle ao qual eles devem se aplicar.

Ser digitado 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 um 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 não string que oferecem suporte a recursos WPF, como ComponentResourceKey Markup Extension.

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

Confira também