Ressources XAMLXAML Resources

Une ressource est un objet pouvant être réutilisé à plusieurs endroits de votre application.A resource is an object that can be reused in different places in your application. Par exemple, les styles et les pinceaux sont des ressources.Examples of resources include brushes and styles. Cette vue d’ensemble décrit comment utiliser des XAMLXAMLressources dans.This overview describes how to use resources in XAMLXAML. Vous pouvez également créer des ressources et y accéder à l’aide de code, ou de façon langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML)interchangeable entre le code et.You can also create and access resources by using code, or interchangeably between code and langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML). Pour plus d’informations, consultez ressources et code.For more information, see Resources and Code.

Notes

Les fichiers de ressources décrits dans cette rubrique sont différents des fichiers de ressources décrits dans les fichiers de ressources, de contenu et de données de l’application WPF et sont différents des ressources incorporées ou liées décrites dans gérer les ressources d' application (.net). .The resource files described in this topic are different than the resource files described in WPF Application Resource, Content, and Data Files and different than the embedded or linked resources described in Manage Application Resources (.NET).

Utilisation des ressources en XAMLUsing Resources in XAML

L’exemple suivant définit une SolidColorBrush en tant que ressource sur l’élément racine d’une page.The following example defines a SolidColorBrush as a resource on the root element of a page. L’exemple référence ensuite la ressource et l’utilise pour définir les propriétés de plusieurs éléments enfants, y Ellipsecompris un TextBlock, un et Buttonun.The example then references the resource and uses it to set properties of several child elements, including an Ellipse, a TextBlock, and a Button.

<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 au niveau de l'FrameworkElement infrastructure FrameworkContentElement(ou) Resources a une propriété, qui est la ResourceDictionarypropriété qui contient les ressources (en tant que) qu’une ressource définit.Every framework-level element (FrameworkElement or FrameworkContentElement) has a Resources property, which is the property that contains the resources (as a ResourceDictionary) that a resource defines. Vous pouvez définir les ressources sur n’importe quel élément.You can define resources on any element. Toutefois, les ressources sont le plus souvent définies sur l’élément racine, Page qui est dans l’exemple.However, resources are most often defined on the root element, which is Page in the example.

Chaque ressource d’un dictionnaire de ressources doit avoir une clé unique.Each resource in a resource dictionary must have a unique key. Quand vous définissez des ressources dans le balisage, vous assignez la clé unique par le biais de la directive x:Key.When you define resources in markup, you assign the unique key through the x:Key Directive. Cette clé est généralement une chaîne, mais vous pouvez aussi la définir en tant qu’autres types d’objets en utilisant les extensions de balisage appropriées.Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. Les clés qui ne sont pas des chaînes pour les ressources sont WPFWPFutilisées par certaines fonctionnalités dans, notamment pour les styles, les ressources de composant et le style des données.Nonstring keys for resources are used by certain feature areas in WPFWPF, notably for styles, component resources, and data styling.

Après avoir défini une ressource, vous pouvez faire référence à cette ressource que vous utilisez pour une valeur de propriété au moyen d’une syntaxe d’extension de balisage de ressource qui spécifie le nom de clé, par exemple :After you define a resource, you can reference the resource to be used for a property value by using a resource markup extension syntax that specifies the key name, for example:

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

Dans l’exemple précédent, lorsque le XAMLXAML chargeur traite la valeur {StaticResource MyBrush} de la Background propriété sur Button, la logique de recherche de la ressource vérifie d’abord le dictionnaire Button de ressources pour l’élément.In the preceding example, when the XAMLXAML loader processes the value {StaticResource MyBrush} for the Background property on Button, the resource lookup logic first checks the resource dictionary for the Button element. Si Button n’a pas de définition de la clé MyBrush de ressource (ce n’est pas le cas; sa collection de ressources est vide), la recherche vérifie Buttonensuite l’élément Pageparent de, qui est.If Button does not have a definition of the resource key MyBrush (it does not; its resource collection is empty), the lookup next checks the parent element of Button, which is Page. Ainsi, lorsque vous définissez une ressource sur l' Page élément racine, tous les éléments de l’arborescence logique Page de 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 que la ressource correspond.Thus, when you define a resource on the Page root element, all the elements in the logical tree of the Page can access it, and you can reuse the same resource for setting the value of any property that accepts the Type that the resource represents. Dans l’exemple précédent, la même MyBrush ressource définit deux propriétés différentes: le Background d’un Buttonet le Fill d’un Rectangle.In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

Ressources statiques et dynamiquesStatic and Dynamic Resources

Une ressource peut être référencée comme ressource statique ou comme ressource dynamique.A resource can be referenced as either a static resource or a dynamic resource. Cela s’effectue à l’aide de l' extension de balisage StaticResource ou de l’extension de balisage DynamicResource.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Une extension de balisage est une XAMLXAML fonctionnalité de dans laquelle vous pouvez spécifier une référence d’objet en faisant en sorte que l’extension de balisage traite XAMLXAML la chaîne d’attribut et retourne l’objet à un chargeur.A markup extension is a feature of XAMLXAML whereby you can specify an object reference by having the markup extension process the attribute string and return the object to a XAMLXAML loader. Pour plus d’informations sur le comportement de l’extension de balisage, consultez extensions de balisage et XAML WPF.For more information about markup extension behavior, see Markup Extensions and WPF XAML.

Quand vous utilisez une extension de balisage, vous fournissez généralement un ou plusieurs paramètres sous forme de chaînes, qui sont traités par cette même extension de balisage plutôt qu’évalués dans le contexte de la définition de la propriété.When you use a markup extension, you typically provide one or more parameters in string form that are processed by that particular markup extension, rather than being evaluated in the context of the property being set. L' extension de balisage StaticResource traite une clé en recherchant la valeur de cette clé dans tous les dictionnaires de ressources disponibles.The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. Cette opération s’effectue pendant le chargement, qui correspond au moment où le processus de chargement doit affecter la valeur de propriété qui prend la référence de ressource statique.This happens during loading, which is the point in time when the loading process needs to assign the property value that takes the static resource reference. L' extension de balisage DynamicResource traite à la place une clé en créant une expression, et cette expression reste non évaluée jusqu’à ce que l’application soit exécutée, auquel cas l’expression est évaluée et fournit une valeur.The DynamicResource Markup Extension instead processes a key by creating an expression, and that expression remains unevaluated until the application is actually run, at which time the expression is evaluated and provides a value.

Quand vous faites référence à une ressource, les points suivants peuvent influer sur votre choix d’utiliser une référence de ressource statique ou à une ressource dynamique :When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • La conception globale de la façon dont vous créez les ressources pour votre application (par page, dans l’application, XAMLXAMLen libre dans un assembly de ressources uniquement).The overall design of how you create the resources for your application (per page, in the application, in loose XAMLXAML, in a resource only assembly).

  • La fonctionnalité de l’application : la mise à jour des ressources en temps réel est-elle obligatoire dans votre application ?The application functionality: is updating resources in real time part of your application requirements?

  • Le comportement de recherche respectif de ce type de référence de ressource.The respective lookup behavior of that resource reference type.

  • Le type de ressource ou de propriété spécifique et le comportement natif de ces types.The particular property or resource type, and the native behavior of those types.

Ressources statiquesStatic Resources

Les références de ressources statiques conviennent parfaitement dans les conditions suivantes :Static resource references work best for the following circumstances:

  • La conception de votre application concentre la plupart de ses ressources dans des dictionnaires de ressources de niveau page ou application.Your application design concentrates most of all of its resources into page or application level resource dictionaries. Les références de ressources statiques ne sont pas réévaluées en fonction des comportements d’exécution (tels que le rechargement d’une page) et donc de meilleures performances peuvent être obtenues puisque de grandes quantités de références de ressources dynamiques sont évitées quand elles ne sont pas nécessaires à la conception de votre application ou de vos ressources.Static resource references are not reevaluated based on runtime behaviors such as reloading a page, and therefore there can be some performance benefit to avoiding large numbers of dynamic resource references when they are not necessary per your resource and application design.

  • Vous définissez la valeur d’une propriété qui ne se trouve pas sur DependencyObject Freezableou.You are setting the value of a property that is not on a DependencyObject or a Freezable.

  • Vous créez un dictionnaire de ressources qui va être compilé dans une DLL et mis dans un package faisant partie de l’application, ou partagé entre plusieurs applications.You are creating a resource dictionary that will be compiled into a DLL, and packaged as part of the application or shared between applications.

  • Vous créez un thème pour un contrôle personnalisé, puis définissez les ressources qui sont utilisées dans les thèmes.You are creating a theme for a custom control, and are defining resources that are used within the themes. Dans ce cas, vous ne souhaitez généralement pas obtenir le comportement recherchant des références de ressources dynamiques, mais plutôt celui qui recherche des références de ressources statiques, afin que cette recherche soit prévisible et autonome dans le thème.For this case, you typically do not want the dynamic resource reference lookup behavior, you instead want the static resource reference behavior so that the lookup is predictable and self-contained to the theme. Avec une référence de ressource dynamique, même une référence dans un thème est laissée sans évaluation jusqu’à l’exécution. Au moment de l’application d’un thème, un élément local risque de redéfinir une clé que votre thème essaie de référencer, si bien que l’élément local tombe avant le thème lui-même dans la recherche.With a dynamic resource reference, even a reference within a theme is left unevaluated until runtime, and there is a chance that when the theme is applied, some local element will redefine a key that your theme is trying to reference, and the local element will fall prior to the theme itself in the lookup. Si cela se produit, votre thème ne se comporte pas comme prévu.If that happens, your theme will not behave in an expected manner.

  • Vous utilisez des ressources pour définir un grand nombre de propriétés de dépendance.You are using resources to set large numbers of dependency properties. Les propriétés de dépendance disposent d’une mise en cache de la valeur réelle, comme le permet le système de propriétés. Par conséquent, si vous fournissez une valeur pour une propriété de dépendance qui peut être évaluée au moment du chargement, cette propriété de dépendance n’a pas à rechercher une expression réévaluée et peut retourner la dernière valeur effective.Dependency properties have effective value caching as enabled by the property system, so if you provide a value for a dependency property that can be evaluated at load time, the dependency property does not have to check for a reevaluated expression and can return the last effective value. Cette technique peut s’avérer un gain de performances.This technique can be a performance benefit.

  • Vous souhaitez modifier la ressource sous-jacente pour tous les consommateurs, ou vous souhaitez conserver des instances accessibles en écriture distinctes pour chaque consommateur à l’aide de l' attribut x:Shared.You want to change the underlying resource for all consumers, or you want to maintain separate writable instances for each consumer by using the x:Shared Attribute.

Comportement de la recherche de ressources statiquesStatic resource lookup behavior

  1. Le processus de recherche recherche la clé demandée dans le dictionnaire de ressources qui est spécifié par l’élément définissant la propriété.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Il remonte ensuite dans l’arborescence logique jusqu’à l’élément parent et son dictionnaire de ressources.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Ce processus se poursuit jusqu’à ce que l’élément racine soit atteint.This continues until the root element is reached.

  3. Ensuite, les ressources de l’application sont recherchées.Next, application resources are checked. Les ressources d’application sont les ressources du dictionnaire de ressources qui sont définies Application par l’objet WPFWPF pour votre application.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

Les références de ressources statiques issues d’un dictionnaire de ressources doivent référencer une ressource qui a déjà été définie sur le plan lexical avant la référence de ressource.Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. Les références anticipées ne peuvent pas être résolues par une référence de ressource statique.Forward references cannot be resolved by a static resource reference. Ainsi, si vous utilisez des références de ressources statiques, vous devez concevoir votre structure de dictionnaires de ressources de telle sorte que les ressources destinées à une utilisation par ressource soient définies au début ou près du début de chaque dictionnaire de ressources respectif.For this reason, if you use static resource references, you must design your resource dictionary structure such that resources intended for by-resource use are defined at or near the beginning of each respective resource dictionary.

La recherche de ressources statiques peut s’étendre à des thèmes ou à des ressources système, mais cela XAMLXAML est pris en charge uniquement parce que le chargeur diffère la demande.Static resource lookup can extend into themes, or into system resources, but this is supported only because the XAMLXAML loader defers the request. Le report est nécessaire pour que le thème d’exécution lors du chargement de la page s’applique correctement à l’application.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the application. Toutefois, les références de ressources statiques aux clés, connues pour exister seulement dans les thèmes ou en tant que ressources système, ne sont pas recommandées.However, static resource references to keys that are known to only exist in themes or as system resources are not recommended. La raison en est que de telles références ne sont pas réévaluées si l’utilisateur change le thème en temps réel.This is because such references are not reevaluated if the theme is changed by the user in realtime. Une référence de ressource dynamique est plus fiable quand vous demandez des ressources de système ou de thème.A dynamic resource reference is more reliable when you request theme or system resources. L’exception se présente lorsqu’un élément de thème lui-même demande une autre ressource.The exception is when a theme element itself requests another resource. Ces références doivent être des références de ressources statiques pour les raisons mentionnées précédemment.These references should be static resource references, for the reasons mentioned earlier.

Le comportement d’exception, en cas de référence de ressource statique introuvable, varie.The exception behavior if a static resource reference is not found varies. Si la ressource a été différée, l’exception se produit lors de l’exécution.If the resource was deferred, then the exception occurs at runtime. Si la ressource n’a pas été différée, l’exception se produit au moment du chargement.If the resource was not deferred, the exception occurs at load time.

Ressources dynamiquesDynamic Resources

Les ressources dynamiques fonctionnent parfaitement dans les circonstances suivantes :Dynamic resources work best for the following circumstances:

  • La valeur de la ressource dépend de conditions qui ne sont pas connues avant l’exécutionThe value of the resource depends on conditions that are not known until runtime. comme les ressources du système ou des ressources qui sont paramétrables par l’utilisateur.This includes system resources, or resources that are otherwise user settable. Par exemple, vous pouvez créer des valeurs d’accesseur Set qui font référence à des SystemColorspropriétés SystemFontssystème, SystemParameterstelles qu’elles sont exposées par, ou.For example, you can create setter values that refer to system properties, as exposed by SystemColors, SystemFonts, or SystemParameters. Ces valeurs sont véritablement dynamiques, car elles proviennent de l’environnement d’exécution de l’utilisateur et du système d’exploitation.These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. Vous pouvez également avoir des thèmes de niveau application qui peuvent changer, où l’accès aux ressources de niveau page doit également capturer le changement.You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • Vous créez ou référencez des styles de thème pour un contrôle personnalisé.You are creating or referencing theme styles for a custom control.

  • Vous avez l’intention d’ajuster le contenu ResourceDictionary d’un pendant la durée de vie d’une application.You intend to adjust the contents of a ResourceDictionary during an application lifetime.

  • Vous avez une structure de ressources complexe avec des interdépendances, où une référence anticipée peut être nécessaire.You have a complicated resource structure that has interdependencies, where a forward reference may be required. Les références de ressources statiques ne prennent pas en charge les références anticipées, mais les références de ressources dynamiques les prennent en charge, car la ressource n’a pas besoin d’être évaluée avant l’exécution, et les références anticipées ne sont donc pas un concept pertinent.Static resource references do not support forward references, but dynamic resource references do support them because the resource does not need to be evaluated until runtime, and forward references are therefore not a relevant concept.

  • Vous référencez une ressource particulièrement grande pour une compilation ou une plage de travail et vous ne pouvez pas l’utiliser immédiatement lorsque la page se charge.You are referencing a resource that is particularly large from the perspective of a compile or working set, and the resource might not be used immediately when the page loads. Les références de ressources statiques XAMLXAML se chargent toujours à partir de lors du chargement de la page; Toutefois, une référence de ressource dynamique n’est pas chargée tant qu’elle n’est pas réellement utilisée.Static resource references always load from XAMLXAML when the page loads; however, a dynamic resource reference does not load until it is actually used.

  • Vous créez un style où les valeurs setter peuvent provenir d’autres valeurs qui sont influencées par des thèmes ou d’autres paramètres utilisateur.You are creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • Vous appliquez des ressources à des éléments susceptibles d’être réapparentés dans l’arborescence logique pendant la durée de vie d’une application.You are applying resources to elements that might be reparented in the logical tree during application lifetime. Le changement de parent peut aussi changer l’étendue de la recherche de ressources, donc si vous souhaitez que la ressource d’un élément réapparenté soit réévaluée en fonction de la nouvelle étendue, utilisez toujours une référence de ressource dynamique.Changing the parent also potentially changes the resource lookup scope, so if you want the resource for a reparented element to be reevaluated based on the new scope, always use a dynamic resource reference.

Comportement de la recherche de ressources dynamiquesDynamic resource lookup behavior

Le comportement de recherche de ressources pour une référence de ressource dynamique correspond au comportement de recherche dans FindResource votre SetResourceReferencecode si vous appelez ou.Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference.

  1. Le processus de recherche recherche la clé demandée dans le dictionnaire de ressources qui est spécifié par l’élément définissant la propriété.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Le processus de recherche remonte ensuite dans l’arborescence logique jusqu’à l’élément parent et son dictionnaire de ressources.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Ce processus se poursuit jusqu’à ce que l’élément racine soit atteint.This continues until the root element is reached.

  3. Ensuite, les ressources de l’application sont recherchées.Next, application resources are checked. Les ressources d’application sont les ressources du dictionnaire de ressources qui sont définies Application par l’objet WPFWPF pour votre application.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

  4. Le thème actif est recherché dans le dictionnaire de ressources de thèmes.Theme resource dictionary is checked, for the currently active theme. Si le thème change au moment de l’exécution, la valeur est réévaluée.If the theme changes at runtime, the value is reevaluated.

  5. Les ressources du système sont recherchées.System resources are checked.

Le comportement d’exception (le cas échéant) varie :Exception behavior (if any) varies:

  • Si une ressource a été demandée par FindResource un appel et qu’elle est introuvable, une exception est levée.If a resource was requested by a FindResource call, and was not found, an exception is raised.

  • Si une ressource a été demandée par TryFindResource un appel et qu’elle est introuvable, aucune exception n’est levée, mais nullla valeur retournée est.If a resource was requested by a TryFindResource call, and was not found, no exception is raised, but the returned value is null. Si la propriété qui est définie n’accepte nullpas, il est toujours possible qu’une exception plus profonde soit levée (cela dépend de la propriété individuelle définie).If the property being set does not accept null, then it is still possible that a deeper exception will be raised (this depends on the individual property being set).

  • Si une ressource a été demandée par une référence de ressource XAMLXAMLdynamique dans, et qu’elle est introuvable, 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é ne s’est produite au niveau de l’emplacement où la ressource existe.If a resource was requested by a dynamic resource reference in XAMLXAML, and was not found, then the behavior depends on the general property system, but the general behavior is as if no property setting operation occurred at the level where the resource exists. 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, aucune définition de valeur n’en résulte alors, mais la valeur réelle peut quand même provenir d’autres participants selon la priorité de la valeur et du système de propriétés.For instance, if you attempt to set the background on a an individual button element using a resource that could not be evaluated, then no value set results, but the effective value can still come from other participants in the property system and value precedence. Par exemple, la valeur de l’arrière-plan peut quand même provenir d’un style de bouton défini localement ou du style du thème.For instance, the background value might still come from a locally defined button style, or from the theme style. Pour les propriétés qui ne sont pas définies par les styles du thème, la valeur réelle, après l’échec d’une évaluation des ressources, peut provenir de la valeur par défaut des métadonnées de propriétés.For properties that are not defined by theme styles, the effective value after a failed resource evaluation might come from the default value in the property metadata.

RestrictionsRestrictions

Les références de ressources dynamiques présentent quelques restrictions notables.Dynamic resource references have some notable restrictions. Au moins une des limitations suivantes doit se vérifier :At least one of the following must be true:

Étant donné que la propriété qui est définie DependencyProperty doit Freezable être une propriété ou, la plupart des modifications de propriétés 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.Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to UI because a property change (the changed dynamic resource value) is acknowledged by the property system. La plupart des contrôles incluent une logique qui force une autre disposition d’un DependencyProperty contrôle si une modification et cette propriété peuvent affecter la disposition.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Toutefois, toutes les propriétés qui ont une extension de balisage DynamicResource comme valeur sont assurées de fournir la valeur de sorte qu’elles soient mises à jour en temps réel dans l’interface utilisateur.However, not all properties that have a DynamicResource Markup Extension as their value are guaranteed to provide the value in such a way that they update in realtime in the UI. Cette fonctionnalité peut varier en fonction de la propriété, du type de propriétaire de la propriété ou même de la structure logique de votre application.That functionality still might vary depending on the property, as well as depending on the type that owns the property, or even the logical structure of your application.

Styles, modèles de données et clés implicitesStyles, DataTemplates, and Implicit Keys

Précédemment, il a été indiqué que tous les éléments ResourceDictionary d’un doivent avoir une clé.Earlier, it was stated that all items in a ResourceDictionary must have a key. Toutefois, cela ne signifie pas que toutes les ressources doivent avoir un x:Keyexplicite.However, that does not mean that all resources must have an explicit x:Key. Plusieurs types d’objets prennent en charge une clé implicite lorsqu’elle est définie en tant que ressource, sachant que la valeur d’une clé est liée à la valeur d’une autre propriété.Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. C’est ce qu’on appelle une clé implicite x:Key , tandis qu’un attribut est une clé explicite.This is known as an implicit key, whereas an x:Key attribute is an explicit key. Vous pouvez remplacer une clé implicite en spécifiant une clé explicite.You can overwrite any implicit key by specifying an explicit key.

Un scénario très important pour les ressources est lorsque vous définissez Styleun.One very important scenario for resources is when you define a 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évus pour être réutilisés.In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. Pour plus d’informations sur les styles, consultez stylisation et création de modèles.For more information about styles, see Styling and Templating.

Des styles de contrôle peuvent être à la fois créés et référencés au moyen d’une clé implicite.Styles for controls can be both created with and referenced with an implicit key. Les styles de thème qui définissent l’apparence par défaut d’un contrôle s’appuient sur cette clé implicite.The theme styles that define the default appearance of a control rely on this implicit key. La clé implicite du point de vue de la demande Type est le du contrôle lui-même.The implicit key from the standpoint of requesting it is the Type of the control itself. La clé implicite du point de vue de la définition de TargetType la ressource est le du style.The implicit key from the standpoint of defining the resource is the TargetType of the style. Par conséquent, si vous créez des thèmes pour des contrôles personnalisés, en créant des styles qui interagissent avec les styles de thème existants, vous n’avez pas Stylebesoin de spécifier une directive x:Key pour cela.Therefore, if you are creating themes for custom controls, creating styles that interact with existing theme styles, you do not need to specify an x:Key Directive for that Style. Et si vous souhaitez utiliser les styles à thème, il n’est pas nécessaire de spécifier un style.And if you want to use the themed styles, you do not need to specify any style at all. Par exemple, la définition de style suivante fonctionne, même si Style la ressource ne semble pas avoir une clé:For instance, the following style definition works, even though the Style resource does not appear to have a key:

<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>

Ce style a vraiment une clé: la clé typeof( Button )implicite.That style really does have a key: the implicit key typeof(Button). Dans le balisage, vous pouvez TargetType spécifier un directement comme nom de type (ou vous pouvez éventuellement utiliser {x:type...}In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} pour retourner un Type.to return a Type.

Par le biais des mécanismes de style de WPFWPFthème par défaut utilisés par, ce style est appliqué comme Button style d’exécution d’un sur la Button page, même si le lui- Style même ne tente pas de spécifier sa propriété ou une ressource spécifique. référence au style.Through the default theme style mechanisms used by WPFWPF, that style is applied as the runtime style of a Button on the page, even though the Button itself does not attempt to specify its Style property or a specific resource reference to the style. Votre style défini dans la page est trouvé précédemment dans la séquence de recherche que le style du dictionnaire de thèmes, en utilisant la même clé que celle du style du dictionnaire de thèmes.Your style defined in the page is found earlier in the lookup sequence than the theme dictionary style, using the same key that the theme dictionary style has. Vous pouvez simplement spécifier <Button>Hello</Button> n’importe où dans la page, et le style que TargetType vous Button avez défini avec la valeur s’applique à ce bouton.You could just specify <Button>Hello</Button> anywhere in the page, and the style you defined with TargetType of Button would apply to that button. Si vous le souhaitez, vous pouvez toujours définir explicitement le style avec la même valeur de TargetTypetype que, pour plus de clarté dans votre balisage, mais cela est facultatif.If you want, you can still explicitly key the style with the same type value as TargetType, for clarity in your markup, but that is optional.

Les clés implicites pour les styles ne s’appliquent OverridesDefaultStyle pas true à un contrôle si OverridesDefaultStyle a la valeur (Notez également que peut être défini dans le cadre du comportement natif de la classe de contrôle, plutôt que de manière explicite sur une instance du contrôle).Implicit keys for styles do not apply on a control if OverridesDefaultStyle is true (also note that OverridesDefaultStyle might be set as part of native behavior for the control class, rather than explicitly on an instance of the control). En outre, pour prendre en charge les clés implicites pour les scénarios de classe dérivée DefaultStyleKey , le contrôle doit se substituer ( WPFWPF tous les contrôles existants fournis dans le cadre de cette opération).Also, in order to support implicit keys for derived class scenarios, the control must override DefaultStyleKey (all existing controls provided as part of WPFWPF do this). Pour plus d’informations sur les styles, les thèmes et la conception de contrôles, consultez instructions pour la conception de contrôles stylisés.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplatea également une clé implicite.DataTemplate also has an implicit key. La clé implicite pour DataTemplate un est DataType la valeur de la propriété.The implicit key for a DataTemplate is the DataType property value. DataTypepeut également être spécifié en tant que nom du type au lieu d’utiliser explicitement {x:type...}.DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. Pour plus d’informations, consultez vue d’ensemble des modèles de données.For details, see Data Templating Overview.

Voir aussiSee also