Partager via


Ressources et code

Cette vue d’ensemble se concentre sur la façon dont les ressources WPF (Windows Presentation Foundation) sont accessibles ou créées à l’aide du code plutôt que de la syntaxe XAML (Extensible Application Markup Language). Pour plus d’informations sur l’utilisation générale des ressources et les ressources du point de vue de la syntaxe XAML, consultez ressources XAML.

Accès aux ressources à partir du code

Les clés qui identifient les ressources si elles sont définies via XAML sont également utilisées pour récupérer des ressources spécifiques si vous demandez la ressource dans le code. La façon la plus simple de récupérer une ressource à partir du code consiste à appeler la FindResource ou la méthode TryFindResource à partir d’objets au niveau de l’infrastructure dans votre application. La différence comportementale entre ces méthodes est ce qui se passe si la clé demandée est introuvable. FindResource déclenche une exception ; TryFindResource ne déclenche pas d’exception, mais retourne null. Chaque méthode prend la clé de ressource comme paramètre d’entrée et retourne un objet faiblement typé. En règle générale, une clé de ressource est une chaîne, mais il existe des utilisations occasionnelles de non-chaîne ; consultez la section Using Objects as Keys pour plus d’informations. En règle générale, vous effectuez un cast de l’objet retourné vers le type requis par la propriété que vous définissez lors de la demande de la ressource. La logique de recherche pour la résolution de ressources de code est identique au cas XAML, dans lequel on utilise une référence de ressource dynamique. La recherche de ressources commence à partir de l’élément appelant, puis continue à successiver les éléments parents dans l’arborescence logique. La recherche se poursuit dans les ressources d’application, les thèmes et les ressources système si nécessaire. Une demande de code pour une ressource compte correctement les modifications d’exécution dans les dictionnaires de ressources susceptibles d’avoir été effectuées après le chargement de ce dictionnaire de ressources à partir de XAML, ainsi que pour les modifications de ressources système en temps réel.

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.

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 l’affectation d’une référence de ressource est SetResourceReference. Cette méthode prend 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 d’élément à laquelle la valeur de ressource doit être affectée. Fonctionnellement, cette méthode est identique et présente l’avantage de ne pas nécessiter de conversion de valeurs de retour.

Une autre façon d’accéder aux ressources par programmation consiste à accéder au contenu de la propriété Resources en tant que dictionnaire. L’accès au dictionnaire contenu par cette propriété est également la façon dont vous pouvez ajouter de nouvelles ressources à des collections existantes, vérifier si un nom de clé donné est déjà pris dans la collection et d’autres opérations de dictionnaire/collection. Si vous écrivez une application WPF entièrement dans le code, vous pouvez également créer la collection entière dans le code, lui attribuer des clés, puis lui affecter la collection terminée à la propriété Resources d’un élément établi. Cette opération sera décrite dans la section suivante.

Vous pouvez indexer dans n’importe quelle collection de Resources donnée, à l’aide d’une clé spécifique comme index, mais vous devez savoir que l’accès à la ressource de cette façon ne respecte pas les règles d’exécution normales de la résolution de ressources. Vous accédez uniquement à cette collection particulière. La recherche de ressources ne se propagera pas vers la racine ou l'application si aucun objet valide n'a été trouvé à la clé demandée. Toutefois, cette approche peut avoir des avantages en matière de performances dans certains cas précisément, car l’étendue de la recherche de la clé est plus limitée. Pour plus d’informations sur l’utilisation directe du dictionnaire de ressources, consultez la classe ResourceDictionary.

Création de ressources avec du code

Si vous souhaitez créer une application WPF entière dans le code, vous pouvez également créer des ressources dans cette application dans le code. Pour ce faire, créez une instance de ResourceDictionary, puis ajoutez toutes les ressources au dictionnaire à l’aide d’appels successifs à ResourceDictionary.Add. Ensuite, utilisez le ResourceDictionary ainsi créé pour définir la propriété Resources sur un élément présent dans le contexte de la page, ou le Application.Resources. Vous pouvez également conserver la ResourceDictionary en tant qu’objet autonome sans l’ajouter à un élément. Toutefois, si vous effectuez cette opération, vous devez accéder aux ressources qu’il contient par clé d’élément, comme s’il s’agissait d’un dictionnaire générique. Un ResourceDictionary qui n’est pas attaché à un élément Resources propriété n’existe pas dans l’arborescence d’éléments et n’a pas d’étendue dans une séquence de recherche qui peut être utilisée par FindResource et les méthodes associées.

Utilisation d’objets en tant que clés

Dans la plupart des cas d’utilisation de ressources, la clé de la ressource est une chaîne. Toutefois, différentes fonctionnalités WPF n’utilisent pas délibérément un type de chaîne pour spécifier des clés, au lieu de cela, ce paramètre est un objet. 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 WPF. Les styles des thèmes, qui deviennent le style par défaut pour un contrôle sans style, sont chacun référencés par le Type du contrôle auquel ils doivent s’appliquer. Être indexé par type fournit 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 styliser des classes dérivées même si le type dérivé n'a autrement pas de style par défaut. Vous pouvez spécifier une clé Type pour une ressource définie en XAML à l’aide de l’extension de balisage x :Type . Des extensions similaires existent pour d’autres utilisations de clés non chaînes qui prennent en charge les fonctionnalités WPF, telles que ComponentResourceKey Markup Extension.

Voir aussi