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 de recursos e recursos de uma perspectiva de sintaxe XAML, consulte Recursos XAML.

Acessando recursos do código

As chaves que identificam recursos se forem definidas por meio de XAML também serã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 FindResource TryFindResource método de objetos de nível de estrutura em seu aplicativo. A diferença comportamental entre esses métodos é o que acontece caso a chave solicitada não seja 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 em que esse não é o caso. Consulte a seção Usando objetos como chaves para obter detalhes. Normalmente, você converteria 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 recurso de código é a mesma que o caso XAML de referência de recurso dinâmico. A pesquisa por recursos é iniciada do elemento de chamada e continua para os elementos pai sucessivos 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 de tempo de execução nos dicionários de recursos que podem ter sido feitas posteriormente ao carregamento do 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 Click eventos.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}

Um método alternativo para atribuir uma referência de recurso é SetResourceReference. Este método utiliza dois parâmetros: a chave do recurso e o identificador de uma determinada propriedade de dependência que está presente na instância do elemento a que 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. Acessando o dicionário contido por esta propriedade, você também pode adicionar novos recursos a coleções existentes, verificar se um nome de chave já existe 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 a coleção inteira em código, atribuir chaves a ele e, em seguida, atribuir a coleção concluída à Resources propriedade de um elemento estabelecido. Isso será 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, mas você 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 aquela coleção em particular. A pesquisa de recursos não percorrerá o escopo 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, precisamente porque o escopo da pesquisa no caso da chave é mais restrito. Consulte a ResourceDictionary classe 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 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, use o assim criado para definir a Resources propriedade em um elemento que está presente em um escopo de página, ou o .ResourceDictionary 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 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 sendo chaveado por um objeto é usada pelo estilo WPF e suporte a temas. Os estilos em temas que se tornam o estilo padrão para um controle sem estilo são cada um digitado pelo Type controle ao qual eles devem se aplicar. Ter como chave um tipo fornece um mecanismo de pesquisa confiável que funciona em instâncias padrão de cada tipo de controle, e 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 não string que oferecem suporte a recursos WPF, como ComponentResourceKey Markup Extension.

Confira também