2010-06-08 7 views
2

Je comprends que l'appel de FindResource() sur un FrameworkElement (par exemple une fenêtre) peut être utilisé pour trouver une ressource dans le ResourceDictionary de FrameworkElement. Par exemple, je l'ai utilisé plusieurs fois pour accéder à un style par le biais d'un code afin d'ajouter dynamiquement un nouveau Setter au style. Je passe toujours la valeur x: Key du style sous la forme d'une chaîne dans la méthode FindResource(). Comme ... Style style = w.FindResource("GridDescriptionColumn") as Style;Pourquoi la méthode FindResource() de FrameworkElement accepte-t-elle un objet et non une chaîne?

Ma question est, j'ai remarqué que FindResource() accepte un argument de type objet et pas un argument de type chaîne. Je ne peux pas pour la vie de mon penser à une raison que j'appellerais FindResource() avec un argument qui n'est pas une chaîne. Cela me fait penser que je ne connais pas d'autres façons d'utiliser FindResource().

Est-ce que quelqu'un sait pourquoi FindResource() accepte un type d'objet et non une chaîne? Si oui, quel serait un exemple d'appel de FindResource() avec un type de paramètre autre qu'une chaîne?

Merci.

Répondre

9

Une ressource peut avoir n'importe quel objet en tant que clé. L'ajout d'une ressource avec une clé d'objet dans le code est facile et peut être utile. En XAML, la plupart du temps vous utilisez une chaîne comme x:Key. Cependant, il y a une affaire commune où la clé est pas une chaîne et vous pourriez même avoir utilisé sans le savoir:

Lorsqu'un Style n'a pas x:Key, il est appliqué à tous les cas de son TargetType. Mais il y a une clé implicite ajoutée par le compilé: le type du TargetType lui-même.

En résumé, l'écriture <Style TargetType="{x:Type Button}" /> dans une section de ressources est exactement la même que l'écriture <Style TargetType="{x:Type Button}" x:Key="{x:Type Button}" />. Pour récupérer cette ressource du code, vous devez utiliser FindResource(typeof(Button)), en passant un Type et non un string.

Questions connexes