Recursos e código

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

Este tópico contém as seguintes seções.

  • Acessando recursos a partir do código
  • Criar recursos com código
  • Usando objetos como chaves
  • Tópicos relacionados

Acessando recursos a partir do código

As chaves que identificam recursos se elas estiverem definidas pelo XAML também são usadas para recuperar os recursos específicos se você solicitar o recurso no código. A maneira mais simples para recuperar um recurso de código é chamar o método FindResource ou TryFindResource dos objetos de nível de framework no seu aplicativo. A diferença entre esses métodos comportamental é o que acontece se a chave solicitada não for encontrada. FindResource gera uma exceção; TryFindResource não irá disparar uma exceção, mas retorna null. Cada método leva a chave de recurso como um parâmetro de entrada e retorna um objeto fracamente tipado. Normalmente, uma chave de recurso é uma sequência de caracteres, mas há usos ocasionais de nonstring; Consulte a seção Usando Objetos como Chave para detalhes. Normalmente você seria converteria o objeto retornado para o tipo exigido pela propriedade que você está definindo quando solicitando o recurso. A lógica de pesquisa para resolução de recurso de código é a mesmo que a referência de recurso dinâmico do caso do XAML. A pesquisa para recursos inicia a partir do elemento de chamada, em seguida, continua em sucessivos elementos pais na árvore lógica. A pesquisa continua em diante em recursos de aplicativo, temas e recursos do sistema se necessário. Uma solicitação de código para um recurso irá corretamente considerar alterações em tempo de execução nos dicionários de recurso que talvez tenham sido feitas após o dicionário de recursos ser carregado do XAML, e também para alterações de recursos de sistema em tempo real.

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

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

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

Ainda outra maneira para acessar recursos de forma programática é acessar o conteúdo da propriedade Resources como um dicionário. Acessar o dicionário contido por esta propriedade é também como você pode adicionar novos recursos em coleções existentes, verificar se um determinado nome da chave já foi usado na coleção e outras operações dicionário/coleção. Se você estiver escrevendo um aplicativo WPF inteiramente no código, você pode também criar toda a coleção no código, atribuir teclas a ela e atribuir a coleção concluída para a propriedade Resources de um elemento estabelecido. Isso será descrito na próxima seção.

Você pode indexar dentro de qualquer coleção Resources dada, usando uma chave específica como o índice, mas você deve estar ciente que acessar o recurso desse modo não segue as regras normais de tempo de execução da resolução de recursos. Você está apenas acessando aquela coleção em particular. Pesquisa de recurso não irá percorrer o escopo 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 para a chave é mais restrita. Consulte a classe ResourceDictionary para obter mais detalhes sobre como trabalhar com o dicionário de recurso diretamente.

Criar recursos com código

Se você estiver criando um aplicativo WPF inteiro no código, você também pode querer cria algum recurso no código naquele aplicativo. Para fazer isso, crie uma nova instância de ResourceDictionary e adicione todos os recursos ao dicionário usando sucessivas chamadas para ResourceDictionary.Add. Em seguida, use o ResourceDictionary assim criado para definir a propriedade Resources em um elemento que está presente no escopo de página, ou o Application.Resources. Você também pode manter o ResourceDictionary como um objeto autônomo sem adicionar um elemento. No entanto, se você fizer isso, você deve acessar os recursos dentro dele pela chave de item, como se fosse um dicionário genérico. Um ResourceDictionary que não está conectado a um elemento Resources propriedade não existiria como parte da árvore de elemento e não tem nenhum escopo em uma sequência de pesquisa que pode ser usado pelo FindResource e métodos relacionados.

Usando objetos como chaves

A maioria dos usos do recurso definirá a chave de recurso como uma string. No entanto, vários recursos WPF deliberadamente não usam um tipo string para especificar chaves, em vez disso, este parâmetro é um objeto. A capacidade de ter o recurso chaveado por um objeto é usada pelo suporte a estilo e temas do WPF. Os estilos nos temas que tornam-se o estilo padrão para um controle não estilizado, caso contrário, são chaveados pelo Type do controle a que eles devem aplicar-se. Sendo chaveado por tipos que fornecem um mecanismo de pesquisa confiável que funciona em instâncias padrão de cada tipo de controle, e tipo podem ser detectados 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 chave de Type para um recurso definido em XAML usando o Marcação de Extensão x:Type. Extensões semelhantes existem para outros usos de chave não string que oferecem suporte a recursos de WPF, como Extensão de Marcação de Marcação.

Consulte também

Conceitos

Visão geral sobre Recursos

Styling and Templating