Ressources XAML

 

Date de publication : juin 2016

Une ressource est un objet qui peut être réutilisé dans différents endroits de votre application. Exemples de ressources incluent des styles et des pinceaux. Cette présentation décrit comment utiliser des ressources dans XAML. Vous pouvez également créer et accéder aux ressources à l’aide de code ou indifféremment entre code et langage XAML (eXtensible Application Markup Language). Pour plus d’informations, consultez ressources et Code.

System_CAPS_ICON_note.jpg Remarque

Les fichiers de ressources décrites dans cette rubrique sont différents que les fichiers de ressources décrites dans ressource d’Application WPF, de contenu et les fichiers de données et différent de ressources incorporés ou liés décrits dans ressources de gestion de l’Application (.NET).

Entity with relative path '../Token/autoOutline_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'.

L’exemple suivant définit un SolidColorBrush en tant que ressource sur l’élément racine d’une page. L’exemple fait référence à la ressource, puis l’utilise pour définir les propriétés de plusieurs éléments enfants, y compris une Ellipse, un TextBlocket un bouton.

<Page Name="root"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <Page.Resources>
    <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
    <Style TargetType="Border" x:Key="PageBackground">
      <Setter Property="Background" Value="Blue"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="TitleText">
      <Setter Property="Background" Value="Blue"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
      <Setter Property="FontSize" Value="18"/>
      <Setter Property="Foreground" Value="#4E87D4"/>
      <Setter Property="FontFamily" Value="Trebuchet MS"/>
      <Setter Property="Margin" Value="0,40,10,10"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
      <Setter Property="DockPanel.Dock" Value="Right"/>
      <Setter Property="FontSize" Value="8"/>
      <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
      <Setter Property="FontFamily" Value="Arial"/>
      <Setter Property="FontWeight" Value="Bold"/>
      <Setter Property="Margin" Value="0,3,10,0"/>
    </Style>
  </Page.Resources>
  <StackPanel>
    <Border Style="{StaticResource PageBackground}">
      <DockPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock DockPanel.Dock="Top" HorizontalAlignment="Left" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" />
      </DockPanel>
    </Border>
  </StackPanel>
</Page>


Chaque élément de niveau infrastructure ( FrameworkElement ou FrameworkContentElement) a un ressources propriété, qui est la propriété qui contient les ressources (comme un ResourceDictionary) qui définit une ressource. Vous pouvez définir les ressources sur n’importe quel élément. Toutefois, les ressources sont souvent définies sur l’élément racine, qui est Page dans l’exemple.

Chaque ressource dans un dictionnaire de ressources doit avoir une clé unique. Lorsque vous définissez des ressources dans le balisage, vous affectez la clé unique via le x : Key Directive. En règle générale, la clé est une chaîne ; Toutefois, vous pouvez également définir cela à d’autres types d’objet en utilisant les extensions de balisage approprié. Les clés pour les ressources sont utilisées par certaines fonctionnalités dans Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'., notamment pour les styles, les ressources de composant et le style des données.

Après avoir défini une ressource, vous pouvez référencer la ressource à utiliser pour une valeur de propriété à l’aide d’une syntaxe d’extension de balisage de ressource qui spécifie le nom de clé, par exemple :

        <Button Background="{StaticResource MyBrush}"/>
        <Ellipse Fill="{StaticResource MyBrush}"/>

Dans l’exemple précédent, lorsque le XAML chargeur traite la valeur {StaticResource MyBrush} pour la arrière-plan propriété sur bouton, la logique de recherche de ressources vérifie d’abord le dictionnaire de ressources pour le bouton élément. Si bouton n’a pas de définition de la clé de ressource MyBrush (il n’est pas le cas ; sa collection de ressources est vide), la recherche vérifie alors l’élément parent de bouton, c'est-à-dire Page. Par conséquent, lorsque vous définissez une ressource sur le Page élément racine, tous les éléments dans l’arborescence logique de la Page peuvent y accéder, et vous pouvez réutiliser la même ressource pour définir la valeur d’une propriété qui accepte le Type qui représente la ressource. Dans l’exemple précédent, la même MyBrush ressource définit deux propriétés différentes : la en arrière-plan d’un boutonet le remplir d’un Rectangle.

Une ressource peut être référencée comme une ressource statique ou une ressource dynamique. Cela en utilisant la StaticResource Markup Extension ou Extension de balisage DynamicResource. Une extension de balisage est une fonctionnalité de XAML qui permet de spécifier une référence d’objet en ayant l’extension de balisage traite la chaîne d’attribut et retourne l’objet à un XAML chargeur. Pour plus d’informations sur le comportement des extensions de balisage, consultez Extensions de balisage et XAML WPF.

Lorsque vous utilisez une extension de balisage, vous fournissez généralement un ou plusieurs paramètres sous forme de chaîne qui sont traités par cette extension de balisage particulière, plutôt qu’en cours d’évaluation dans le cadre de la propriété définie. Le StaticResource Markup Extension traite une clé en recherchant la valeur de cette clé dans tous les dictionnaires de ressources disponibles. Cela se produit pendant le chargement, qui est le point dans le temps lorsque le processus de chargement doit affecter la valeur de propriété qui prend la référence de ressource statique. Le Extension de balisage DynamicResource à la place des processus une clé en créant une expression et cette expression reste sans évaluation jusqu'à ce que l’application s’exécute en fait, date à laquelle l’expression est évaluée et fournit une valeur.

Lorsque vous référencez une ressource, les considérations suivantes peuvent déterminer si vous utilisez une référence à une ressource statique ou une référence à une ressource dynamique :

  • La conception globale de la façon dont vous créez les ressources pour votre application (par page, dans l’application, en perdre XAML, dans un assembly ressource seulement).

  • La fonctionnalité d’application : mise à jour des ressources dans la partie en temps réel des spécifications de votre application ?

  • Le comportement de recherche respectif de ce type de référence de ressource.

  • La propriété ou type de ressource et le comportement natif de ces types.

Ressources statiques

Références de ressources statiques travail mieux dans les circonstances suivantes :

  • Conception de votre application concentre l’essentiel de l’ensemble de ses ressources dans la page ou les ressources de niveau application dictionnaires. Références de ressources statiques ne sont pas réévaluées selon les comportements d’exécution tels que le rechargement d’une page, et par conséquent, il peut y avoir des gains de performance pour éviter un grand nombre de références de ressource dynamique lorsqu’ils ne sont pas nécessaires pour la conception de votre application et les ressources.

  • Vous définissez la valeur d’une propriété qui n’est pas suite un DependencyObject ou Freezable.

  • Vous créez un dictionnaire de ressources qui est compilé dans une DLL et empaqueté dans le cadre de l’application ou partagé entre plusieurs applications.

  • Vous créez un thème pour un contrôle personnalisé et définissez des ressources qui sont utilisées dans les thèmes. Dans ce cas, vous ne souhaitez généralement pas le comportement de recherche de référence de ressource dynamique, mais plutôt le comportement de référence de ressource statique afin que la recherche est prévisible et autonome dans le thème. Une ressource dynamique référence, même qu'une référence dans un thème est laissée sans évaluation jusqu'à l’exécution, et il existe un risque que lorsque le thème est appliqué, redéfinit une clé que votre thème essaie de référencer un élément local et l’élément local tombera préalable pour le thème lui-même dans la recherche. Dans ce cas, votre thème se comportera pas attendu.

  • Vous utilisez des ressources pour définir le grand nombre de propriétés de dépendance. Propriétés de dépendance ont la valeur effective de la mise en cache activée par le système de propriétés, donc si vous fournissez une valeur pour une propriété de dépendance qui peut être évaluées au moment du chargement, la propriété de dépendance n’a pas rechercher une expression reevaluated et peut retourner la dernière valeur effective. Cette technique peut être un gain de performances.

  • Vous souhaitez modifier la ressource sous-jacente pour tous les consommateurs ou vous souhaitez maintenir séparez des instances accessibles en écriture pour chaque consommateur à l’aide de la x : Shared Attribute.

Comportement de recherche de ressources statiques

  1. Le processus de recherche vérifie la clé du dictionnaire de ressources défini par l’élément qui définit la propriété demandée.

  2. Le processus de recherche parcourt alors l’arborescence logique vers le haut, à l’élément parent et son dictionnaire de ressources. Ce processus se poursuit jusqu'à ce que l’élément racine est atteint.

  3. Ensuite, les ressources d’application sont vérifiées. Ressources d’application sont ces ressources du dictionnaire de ressources défini par le Application de l’objet pour votre Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'. application.

Les références de ressources statiques dans un dictionnaire de ressources doivent faire référence à une ressource qui a déjà été définie sur le plan lexical avant la référence à une ressource. Références anticipées ne peut pas être résolus en une référence à une ressource statique. Pour cette raison, si vous utilisez des références de ressources statiques, vous devez concevoir votre structure de dictionnaire de ressources telles que les ressources destinées à une utilisation par ressource sont définis sur ou près du début de chaque dictionnaire de ressources respectif.

Recherche de ressources statiques peut s’étendre aux thèmes, ou dans les ressources système, mais cela est pris en charge seulement parce que le XAML chargeur diffère de la requête. Le rapport est nécessaire pour que le thème d’exécution lors du que chargement de la page s’applique correctement à l’application. Toutefois, références de ressources statiques aux clés qui sont connues pour exister seulement dans les thèmes ou en tant que système de ressources ne sont pas recommandées. Il s’agit, car de telles références ne sont pas réévaluées si le thème est modifié par l’utilisateur en temps réel. Une référence à une ressource dynamique est plus fiable lorsque vous demandez des ressources système ou thème. L’exception est lorsqu’un élément de thème lui-même demande une autre ressource. Ces références doivent être des références de ressources statiques, pour les raisons mentionnées précédemment.

Le comportement d’exception si une référence à une ressource statique n’est pas trouvée varie. Si la ressource a été différée, l’exception se produit lors de l’exécution. Si la ressource n’était pas différée, l’exception se produit au moment du chargement.

Ressources dynamiques

Les ressources dynamiques fonctionnent mieux dans les circonstances suivantes :

  • La valeur de la ressource dépend des conditions qui ne sont pas connues avant l’exécution. Cela inclut les ressources système ou des ressources qui sont autrement paramétrables. Par exemple, vous pouvez créer des valeurs d’accesseur Set qui font référence aux propriétés du système, comme exposé par SystemColors, des SystemFonts, ou SystemParameters. Ces valeurs sont véritablement dynamiques car elles proviennent en fin de compte l’environnement d’exécution de l’utilisateur et le système d’exploitation. Vous pouvez également avoir des thèmes de niveau application qui peuvent changer, où l’accès aux ressources de niveau page doit également intercepter la modification.

  • Vous créez ou référencez des styles de thème pour un contrôle personnalisé.

  • Vous envisagez d’ajuster le contenu d’un ResourceDictionary pendant une durée de vie d’application.

  • Vous avez une structure de ressources complexe avec des interdépendances, où une référence directe peut être nécessaire. Références de ressources statiques ne prennent pas en charge les références vers l’avant, mais les références de ressources dynamiques prennent en charge les car la ressource n’a pas besoin d’être évaluée avant l’exécution, et références anticipées ne sont donc pas un concept pertinent.

  • Vous faites référence à une ressource qui est particulièrement important du point de vue d’une compilation ou une plage de travail, et la ressource ne peut pas être utilisée immédiatement lorsque la page se charge. Références de ressources statiques toujours chargement à partir de XAML lorsque la page se charge ; Toutefois, une référence à une ressource dynamique ne se charge pas jusqu'à ce qu’il est réellement utilisé.

  • Vous créez un style où les valeurs d’accesseur Set peuvent provenir d’autres valeurs qui sont influencées par les thèmes ou autres paramètres de l’utilisateur.

  • Vous appliquez des ressources à des éléments qui peuvent être à nouveau apparentés dans l’arborescence logique pendant la durée de vie des applications. Le parent peut également modifier l’étendue de recherche de ressources, par conséquent, si vous souhaitez que la ressource d’un élément nouveau apparenté réévaluation en fonction de la nouvelle étendue, utilisez toujours une référence à une ressource dynamique.

Comportement de recherche dynamique des ressources

Comportement de recherche pour une référence de ressource dynamique correspond au comportement de recherche dans votre code si vous appelez FindResource ou SetResourceReference.

  1. Le processus de recherche vérifie la clé du dictionnaire de ressources défini par l’élément qui définit la propriété demandée.

  2. Le processus de recherche parcourt alors l’arborescence logique vers le haut, à l’élément parent et son dictionnaire de ressources. Ce processus se poursuit jusqu'à ce que l’élément racine est atteint.

  3. Ensuite, les ressources d’application sont vérifiées. Ressources d’application sont ces ressources du dictionnaire de ressources défini par le Application de l’objet pour votre Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'. application.

  4. Dictionnaire de ressources de thème pour le thème actuellement actif est activée. Si le thème change au moment de l’exécution, la valeur est réévaluée.

  5. Les ressources système sont vérifiées.

Comportement d’exception (le cas échéant) varie :

  • Si une ressource a été demandée par un FindResource appeler et n’a pas été trouvé, une exception est levée.

  • Si une ressource a été demandée par un TryFindResource appeler et est introuvable, aucune exception n’est levée, mais la valeur retournée est null. Si la valeur de propriété n’accepte pas null, il est toujours possible qu’une exception plus profonde soit levée (Cela dépend de la propriété définie).

  • Si une ressource a été demandée par une référence à une ressource dynamique dans XAMLet est introuvable, alors le comportement dépend du système de propriétés général, mais le comportement général est comme si aucune opération de définition de propriété s’est produite au niveau où la ressource existe. Par exemple, si vous essayez de définir l’arrière-plan d’un élément bouton à l’aide d’une ressource qui ne peut pas être déterminée, puis aucune valeur ne définie résultats, mais la valeur effective peut quand même provenir d’autres participants dans la priorité de système et la valeur de propriété. Par exemple, la valeur arrière-plan peut quand même provenir d’un style de bouton défini localement ou dans le style de thème. Pour les propriétés qui ne sont pas définies par les styles de thème, la valeur effective après une évaluation des ressources ayant échoué peut-être provenir de la valeur par défaut dans les métadonnées de propriété.

Restrictions

Références de ressources dynamiques ayant quelques restrictions notables. Au moins une des opérations suivantes doit être remplie :

Étant donné que la valeur de propriété doit être un DependencyProperty ou Freezable propriété, la plupart des modifications de propriété peuvent se propager à l’interface utilisateur, car une modification de propriété (la valeur de ressource dynamique modifiée) est reconnue par le système de propriétés. La plupart des contrôles incluent la logique qui forcera une autre disposition d’un contrôle si une DependencyProperty modifications et la propriété peut affecter la disposition. Cependant, pas toutes les propriétés qui ont un Extension de balisage DynamicResource comme valeur sont assurées de fournir la valeur de sorte qu’ils mettent à jour en temps réel dans l’interface utilisateur. Cette fonctionnalité peut varier en fonction de la propriété, ainsi que selon le type de propriétaire de la propriété, ou même la structure logique de votre application.

Plus haut, il a été indiqué que tous les éléments dans un ResourceDictionary doit avoir une clé. Toutefois, cela ne signifie pas que toutes les ressources doivent avoir explicite x:Key. Plusieurs types d’objet prend en charge une clé implicite lorsque défini en tant que ressource, où la valeur de clé est liée à la valeur d’une autre propriété. Il s’agit une clé implicite, alors qu’un x:Key attribut est une clé explicite. Vous pouvez remplacer toute clé implicite en spécifiant une clé explicite.

Un scénario très important pour les ressources est lorsque vous définissez un Style. En fait, un Style est presque toujours défini en tant qu’entrée dans un dictionnaire de ressources, car les styles sont par nature prévues pour être réutilisées. Pour plus d’informations sur les styles, consultez styles et modèles.

Styles des contrôles peuvent être créées avec et référencés avec une clé implicite. Les styles de thème qui définissent l’apparence par défaut d’un contrôle s’appuient sur cette clé implicite. La clé implicite du point de vue de sa requête est le Type du contrôle lui-même. La clé implicite du point de vue de la définition de la ressource est la TargetType du style. Par conséquent, si vous créez des thèmes pour les contrôles personnalisés, créant des styles qui interagissent avec des styles de thème existant, il est inutile de spécifier un x : Key Directive pour que Style. Et si vous souhaitez utiliser les styles de thème, vous n’avez pas besoin spécifier un style à tous les. Par exemple, la définition de style suivante fonctionne, même si le Style ressource ne semble pas avoir une clé :

    <Style TargetType="Button">
      <Setter Property="Background">
        <Setter.Value>
          <LinearGradientBrush>
            <GradientStop Offset="0.0" Color="AliceBlue"/>
            <GradientStop Offset="1.0" Color="Salmon"/>           
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>  
      <Setter Property="FontSize" Value="18"/>
    </Style>

Que style a vraiment une clé : la clé implicite typeof( bouton). Dans le balisage, vous pouvez spécifier un TargetType directement en tant que le type de nom (ou vous pouvez éventuellement utiliser {x : Type...} pour retourner un Type.

Grâce aux mécanismes de style de thème par défaut utilisés par Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'., ce style est appliqué en tant que style d’exécution d’une bouton sur la page, même si le bouton lui-même ne tente pas de spécifier sa Style propriété ou une référence à une ressource spécifique pour le style. Votre style défini dans la page se trouve plus haut dans la séquence de recherche plus haut que le style de dictionnaire thème, à l’aide de la même clé que celle qui a le style de dictionnaire du thème. Vous pouvez simplement spécifier <Button>Hello</Button> n’importe où dans la page et le style que vous avez défini avec TargetType de Button s’applique à ce bouton. Si vous le souhaitez, vous pouvez masquer toujours explicitement le style avec la même valeur de type en tant que TargetType, pour plus de clarté dans votre balisage, mais qui est facultatif.

Les clés implicites pour les styles ne s’appliquent pas sur un contrôle si OverridesDefaultStyle est true (Notez également que OverridesDefaultStyle peut être défini dans le cadre du comportement natif pour la classe de contrôle, plutôt qu’explicitement sur une instance du contrôle). En outre, pour prendre en charge les clés implicites pour les scénarios de classe dérivée, le contrôle doit substituer DefaultStyleKey (tous les contrôles existants fournis dans le cadre de Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"fr-FR"}'. cela). Pour plus d’informations sur la conception du contrôle, les thèmes et les styles, consultez recommandations en matière de conception des contrôles d’appliquer un style.

DataTemplate a également une clé implicite. La clé implicite pour un DataTemplate est la type de données valeur de propriété. Type de données peut également être spécifié comme nom de type au lieu d’utiliser explicitement {x : Type...} . Pour plus d’informations, consultez vue d’ensemble de la création de modèles de données.

ResourceDictionary
Ressources d’application
Ressources et Code
Définir et référencer une ressource
Vue d’ensemble de la gestion des applications
Extension de balisage x : Type
Extension de balisage de StaticResource
Extension de balisage de DynamicResource

Afficher: