Partager via


Ressources dans le code (WPF .NET)

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. Pour plus d’informations sur l’utilisation générale des ressources et les ressources du point de vue de la syntaxe XAML, consultez Vue d’ensemble des ressources XAML.

Accès aux ressources à partir du code

Les clés qui identifient les ressources définies PAR 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 comportementale entre ces méthodes est ce qui se passe si la clé demandée n’est pas trouvée. 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. 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 à partir de l’élément appelant, puis se poursuit par le biais d’é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 apportées à ces ressources qui se sont produites pendant l’exécution.

L’exemple de code suivant illustre un gestionnaire d’événements Click qui recherche une ressource par clé et utilise la valeur retournée pour définir une propriété.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(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. 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. Les dictionnaires de ressources sont utilisés pour ajouter de nouvelles ressources à des collections existantes, vérifiez si un nom de clé donné est déjà utilisé par la collection et d’autres opérations. Si vous écrivez entièrement une application WPF dans du code, vous pouvez également créer la collection entière dans le code, lui attribuer des ressources. La collection peut ensuite être affectée à la Resources propriété d’un élément. Cette procédure est décrite dans la section suivante.

Vous pouvez indexer dans n’importe quelle collection donnée Resources , à l’aide d’une clé spécifique comme index. Les ressources accessibles de cette façon ne suivent 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 traverse pas l’étendue de ressource à la racine ou à l’application si aucun objet valide n’a été trouvé à 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 d’un 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, affectez la propriété créée ResourceDictionary 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 l’arborescence d’éléments et n’a pas d’étendue dans une séquence de choix qui peut être utilisée par FindResource des 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 utilisent délibérément le type d’objet comme clé au lieu d’une chaîne. La fonctionnalité de clé de la ressource par un type d’objet est utilisée par le style WPF et la prise en charge des thèmes. Les styles et les thèmes qui deviennent la valeur par défaut d’un contrôle autre que style sont chacun clé par le Type contrôle auquel ils doivent s’appliquer.

La clé par type fournit un mécanisme de recherche fiable qui fonctionne sur les instances par défaut de chaque type de contrôle. Le type peut être détecté par réflexion et utilisé pour les classes dérivées de style, même si le type dérivé n’a pas de 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.

Pour plus d’informations, consultez Styles, DataTemplates et clés implicites.

Voir aussi