Compartilhar via


Recursos no código

Essa visão geral concentra-se em como os recursos do WPF (Windows Presentation Foundation) 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 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 gera uma exceção. TryFindResource não gerará uma exceção, mas retornará null. Cada método usa a chave de recurso como um parâmetro de entrada e retorna um objeto com tipo flexível.

Normalmente, uma chave de recurso é uma cadeia de caracteres, mas há usos ocasionais nãostring. A lógica de busca para resolver recursos de código é igual ao caso de referência XAML de recurso dinâmico. A pesquisa por recursos começa a partir do elemento de chamada e, em seguida, continua por meio de elementos pai na árvore lógica. A pesquisa continua adiante em recursos de aplicativo, temas e recursos do sistema, se necessário. Uma solicitação de código para um recurso contabilará corretamente as alterações nos recursos que ocorreram durante o runtime.

O exemplo de código a seguir demonstra um Click manipulador de 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 é o mesmo 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 propriedade Resources como um dicionário. 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 no código, atribuir recursos a ele. Em seguida, a coleção pode ser atribuída à Resources propriedade de um elemento. Isso é descrito na próxima seção.

Você pode indexar em qualquer coleção específica Resources , usando uma chave específica como o índice. Os recursos acessados dessa forma não seguem as regras normais de runtime da resolução de recursos. Você só está acessando essa coleção específica. A pesquisa de recursos não percorrerá o escopo do recurso até a raiz ou o aplicativo se nenhum objeto válido tiver sido encontrado na chave solicitada. No entanto, essa abordagem pode ter vantagens de desempenho em alguns casos justamente porque o escopo da pesquisa 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 você também queira criar todos os recursos nesse aplicativo no código. Para conseguir isso, crie uma nova instância de ResourceDictionary e adicione todos os recursos ao dicionário usando chamadas sucessivas para ResourceDictionary.Add. Em seguida, atribua a ResourceDictionary criada para definir a propriedade Resources em um elemento que está presente no escopo da 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, deverá acessar os recursos dentro dele por chave de item, como se 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 teria escopo em uma sequência de busca que possa ser usada 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 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 do WPF e pelo suporte a temas. Os estilos e temas que se tornam o padrão para um controle que, de outra forma, não possui estilo, são atribuídos a cada controle específico ao qual devem se aplicar.

A chave 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, ainda que o tipo derivado não tenha nenhum estilo padrão. Você pode especificar uma chave de Type para um recurso definido em XAML usando a Extensão de Marcação x:Type. Extensões semelhantes existem para outros usos de chave diferentes de cadeias de caracteres que dão suporte a recursos do WPF, como a Extensão de marcação ComponentResourceKey.

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

Consulte também