Ressources et codeResources and Code

Cette présentation décrit comment accéder aux ressources Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) ou les créer à l’aide de code au lieu de la syntaxe langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML).This overview concentrates on how Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) resources can be accessed or created using code rather than langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML) syntax. Pour plus d’informations sur l’utilisation générale des ressources et sur les ressources du point de vue de la syntaxe XAMLXAML, consultez Ressources XAML.For more information on general resource usage and resources from a XAMLXAML syntax perspective, see XAML Resources.

Accès aux ressources à partir du codeAccessing Resources from Code

Les clés qui identifient les ressources, si elles sont définies en XAMLXAML, sont également utilisées pour récupérer des ressources spécifiques si vous demandez la ressource dans le code.The keys that identify resources if they are defined through XAMLXAML are also used to retrieve specific resources if you request the resource in code. La façon la plus simple de récupérer une ressource à partir du code consiste à appeler la méthode FindResource ou TryFindResource à partir d’objets au niveau de l’infrastructure dans votre application.The simplest way to retrieve a resource from code is to call either the FindResource or the TryFindResource method from framework-level objects in your application. La différence entre ces méthodes se situe au niveau de leur comportement quand la clé demandée est introuvable.The behavioral difference between these methods is what happens if the requested key is not found. FindResource lève une exception ; TryFindResource ne lève pas d’exception, mais retourne null.FindResource raises an exception; TryFindResource will not raise an exception but returns null. Chaque méthode prend la clé de ressource comme paramètre d’entrée et retourne un objet faiblement typé.Each method takes the resource key as an input parameter, and returns a loosely typed object. Une clé de ressource est généralement une chaîne, mais il arrive que ce ne soit pas le cas. Pour plus d’informations, consultez la section Utilisation d’objets comme clés.Typically, a resource key is a string, but there are occasional nonstring usages; see the Using Objects as Keys section for details. En principe, vous castez l’objet retourné en type nécessaire pour la propriété que vous définissez quand vous demandez la ressource.Typically you would cast the returned object to the type required by the property that you are setting when requesting the resource. La logique de recherche pour la résolution d’une ressource de code est la même que pour une référence de ressource dynamique XAMLXAML.The lookup logic for code resource resolution is the same as the dynamic resource reference XAMLXAML case. La recherche de ressources commence dans l’élément appelant, puis se poursuit dans les éléments parents successifs de l’arborescence logique.The search for resources starts from the calling element, then continues to successive parent elements in the logical tree. La recherche se poursuit dans les ressources d’application, les thèmes et les ressources système, si nécessaire.The lookup continues onwards into application resources, themes, and system resources if necessary. Une demande de code pour une ressource tient compte des changements d’exécution dans les dictionnaires de ressources qui ont pu avoir lieu à la suite du chargement du dictionnaire de ressources par XAMLXAML, ainsi que des changements des ressources système en temps réel.A code request for a resource will properly account for runtime changes in resource dictionaries that might have been made subsequent to that resource dictionary being loaded from XAMLXAML, and also for realtime system resource changes.

Voici un bref exemple de code qui recherche une ressource par clé et utilise la valeur retournée pour définir une propriété, implémentée en tant que gestionnaire d’événements Click.The following is a brief code example that finds a resource by key and uses the returned value to set a property, implemented as a Click event handler.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Une autre méthode pour assigner une référence de ressource est SetResourceReference.An alternative method for assigning a resource reference is SetResourceReference. Cette méthode accepte deux paramètres : la clé de la ressource et l’identificateur d’une propriété de dépendance particulière présente sur l’instance de l’élément auquel la valeur de ressource doit être assignée.This method takes two parameters: the key of the resource, and the identifier for a particular dependency property that is present on the element instance to which the resource value should be assigned. En pratique, cette méthode est la même et a l’avantage de ne pas nécessiter de cast des valeurs de retour.Functionally, this method is the same and has the advantage of not requiring any casting of return values.

Encore une autre façon d’accéder aux ressources par programme consiste à accéder au contenu de la propriété Resources en tant que dictionnaire.Still another way to access resources programmatically is to access the contents of the Resources property as a dictionary. C’est aussi en accédant au dictionnaire contenu dans cette propriété que vous pouvez ajouter de nouvelles ressources aux collections existantes, vérifier si le nom d’une clé donnée est déjà utilisé dans la collection ainsi que d’autres opérations de dictionnaire/collection.Accessing the dictionary contained by this property is also how you can add new resources to existing collections, check to see if a given key name is already taken in the collection, and other dictionary/collection operations. Si vous écrivez une application WPFWPF entièrement dans du code, vous pouvez également créer l’ensemble de la collection dans le code, lui affecter des clés, puis affecter la collection finie à la propriété Resources d’un élément établi.If you are writing a WPFWPF application entirely in code, you can also create the entire collection in code, assign keys to it, and then assign the finished collection to the Resources property of an established element. Ces opérations sont décrites dans la section suivante.This will be described in the next section.

Vous pouvez effectuer l’indexation dans une collection Resources donnée, à l’aide d’une clé spécifique comme index, mais vous devez savoir que l’accès à la ressource de cette manière ne suit pas les règles d’exécution normales de la résolution des ressources.You can index within any given Resources collection, using a specific key as the index, but you should be aware that accessing the resource in this way does not follow the normal runtime rules of resource resolution. Vous accédez uniquement à cette collection particulière.You are only accessing that particular collection. La recherche de ressources ne s’étend pas à la racine ou à l’application si aucun objet valide n’est trouvé au niveau de la clé demandée.Resource lookup will not be traversing the scope to the root or the application if no valid object was found at the requested key. Toutefois, cette approche peut parfois améliorer les performances, précisément parce que l’étendue de la recherche de la clé est plus limitée.However, this approach may have performance advantages in some cases precisely because the scope of the search for the key is more constrained. Pour plus d’informations sur l’utilisation directe du dictionnaire de ressources, consultez la classe ResourceDictionary.See the ResourceDictionary class for more details on how to work with the resource dictionary directly.

Création de ressources avec du codeCreating Resources with Code

Si vous voulez créer une application WPFWPF entière en code, vous voudrez vraisemblablement aussi créer des ressources de cette application en code.If you want to create an entire WPFWPF application in code, you might also want to create any resources in that application in code. Pour ce faire, créez une instance de ResourceDictionary, puis ajoutez toutes les ressources au dictionnaire à l’aide d’appels successifs à ResourceDictionary.Add.To achieve this, create a new ResourceDictionary instance, and then add all the resources to the dictionary using successive calls to ResourceDictionary.Add. Utilisez ensuite le ResourceDictionary créé pour définir la propriété Resources sur un élément qui est présent dans une étendue de page ou le Application.Resources.Then, use the ResourceDictionary thus created to set the Resources property on an element that is present in a page scope, or the Application.Resources. Vous pouvez également conserver le ResourceDictionary en tant qu’objet autonome sans l’ajouter à un élément.You could also maintain the ResourceDictionary as a standalone object without adding it to an element. Toutefois, dans ce cas, vous devez accéder aux ressources qu’il contient par clé d’élément, comme pour un dictionnaire générique.However, if you do this, you must access the resources within it by item key, as if it were a generic dictionary. Une ResourceDictionary qui n’est pas attachée à un élément Resources propriété n’existe pas dans le cadre de l’arborescence d’éléments et n’a pas de portée dans une séquence de recherche qui peut être utilisée par FindResource et les méthodes associées.A ResourceDictionary that is not attached to an element Resources property would not exist as part of the element tree and has no scope in a lookup sequence that can be used by FindResource and related methods.

Utilisation d’objets comme clésUsing Objects as Keys

Dans la plupart des cas d’utilisation de ressources, la clé de la ressource est une chaîne.Most resource usages will set the key of the resource to be a string. Toutefois, diverses fonctionnalités WPFWPF n’utilisent pas délibérément le type chaîne pour spécifier des clés, mais définissent ce paramètre sur un objet.However, various WPFWPF features deliberately do not use a string type to specify keys, instead this parameter is an object. Vous avez la possibilité d’indexer une ressource à l’aide d’un objet grâce à la prise en charge des thèmes et des styles WPFWPF.The capability of having the resource be keyed by an object is used by the WPFWPF style and theming support. Les styles dans les thèmes qui deviennent le style par défaut pour un contrôle sans style, sont tous indexés par le Type du contrôle auquel ils doivent s’appliquer.The styles in themes which become the default style for an otherwise non-styled control are each keyed by the Type of the control that they should apply to. L’indexation par le type est un mécanisme de recherche fiable qui fonctionne sur les instances par défaut de chaque type de contrôle, et le type peut être détecté par réflexion et utilisé pour appliquer un style aux classes dérivées, même si le type dérivé n’a aucun style par défaut.Being keyed by type provides a reliable lookup mechanism that works on default instances of each control type, and type can be detected by reflection and used for styling derived classes even though the derived type otherwise has no default style. Vous pouvez spécifier une clé de Type pour une ressource définie dans XAMLXAML à l’aide de l' extension de balisage x :type.You can specify a Type key for a resource defined in XAMLXAML by using the x:Type Markup Extension. Des extensions similaires dans d’autres cas d’utilisation de clé non-chaîne prennent en charge des fonctionnalités WPFWPF, comme l’extension de balisage ComponentResourceKey.Similar extensions exist for other nonstring key usages that support WPFWPF features, such as ComponentResourceKey Markup Extension.

Voir aussiSee also