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 méthode ou à partir d’objets au niveau de l’infrastructure FindResourceTryFindResource dans votre application. La différence entre ces méthodes se situe au niveau de leur comportement quand 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é. 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. En principe, vous castez l’objet retourné en type nécessaire pour la propriété que vous définissez quand vous demandez la ressource. La logique de recherche pour la résolution de ressources de code est identique au cas XAML de référence des ressources dynamiques. La recherche de ressources commence dans l’élément appelant, puis se poursuit dans les éléments parents successifs de 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 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. En pratique, cette méthode est la même et a l’avantage de ne pas nécessiter de cast des valeurs de retour.

Une autre façon d’accéder aux ressources par programmation consiste à accéder au contenu de la Resources propriété en tant que dictionnaire. 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. 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 Resources propriété d’un élément établi. Ces opérations sont décrites dans la section suivante.

Vous pouvez indexer dans n’importe quelle collection donnée Resources , à 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 s’étend pas à la racine ou à l’application si aucun objet valide n’est trouvé au niveau de la clé demandée. 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. Pour plus d’informations sur l’utilisation directe du dictionnaire de ressources, consultez la ResourceDictionary classe.

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 ResourceDictionary , puis ajoutez toutes les ressources au dictionnaire à l’aide d’appels successifs à ResourceDictionary.Add. Ensuite, utilisez la ResourceDictionary valeur ainsi créée pour définir la Resources propriété sur un élément présent dans une étendue de page, ou le Application.Resources. Vous pouvez également conserver l’objet ResourceDictionary autonome sans l’ajouter à un élément. 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. Un ResourceDictionary élément qui n’est pas attaché à une propriété d’élément Resources n’existe pas dans le cadre de l’arborescence d’éléments et n’a pas d’étendue dans une séquence de recherche qui peut être utilisée par FindResource des méthodes associées.

Utilisation d’objets comme 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. La fonctionnalité de clé de la ressource par un objet est utilisée par le style WPF et la prise en charge des thèmes. Les styles dans les thèmes qui deviennent le style par défaut d’un contrôle sans style sont chacun clé par le Type contrôle auquel ils doivent s’appliquer. 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. Vous pouvez spécifier une Type clé pour une ressource définie en XAML à l’aide de l’extension x :Type Markup. 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