Übersicht über XAML-RessourcenOverview of XAML resources

Eine Ressource ist ein Objekt, das an unterschiedlichen Stellen in Ihrer App wiederverwendet werden kann.A resource is an object that can be reused in different places in your app. Beispiele für Ressourcen sind Pinsel und Stile.Examples of resources include brushes and styles. In dieser Übersicht wird beschrieben, wie Ressourcen in XAML (Extensible Application Markup Language) verwendet werden.This overview describes how to use resources in Extensible Application Markup Language (XAML). Sie können auch mithilfe von Code Ressourcen erstellen und auf diese zugreifen.You can also create and access resources by using code.

Hinweis

Die in diesem Artikel beschriebenen XAML-Ressourcen unterscheiden sich von App-Ressourcen, die in der Regel Dateien sind, die einer App hinzugefügt werden, z. B. Inhalte, Daten oder eingebettete Dateien.XAML resources described in this article are different from app resources which are generally files added to an app, such as content, data, or embedded files.

Wichtig

Der Desktopleitfaden ist in Bearbeitung.The Desktop Guide documentation is under construction.

Verwenden von Ressourcen in XAMLUsing resources in XAML

Im folgenden Beispiel wird ein SolidColorBrush-Element als Ressource für das Stammelement einer Seite definiert.The following example defines a SolidColorBrush as a resource on the root element of a page. Anschließend verweist das Beispiel auf die Ressource und verwendet sie, um Eigenschaften mehrerer untergeordneter Elemente festzulegen, einschließlich eines Ellipse-, eines TextBlock- und eines Button-Elements.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>


Jedes Element auf Frameworkebene (FrameworkElement oder FrameworkContentElement) verfügt über eine Resources-Eigenschaft. Hierbei handelt es sich um einen ResourceDictionary-Typ, der definierte Ressourcen enthält.Every framework-level element (FrameworkElement or FrameworkContentElement) has a Resources property, which is a ResourceDictionary type that contains defined resources. Sie können Ressourcen für beliebige Elemente definieren, z. B.für ein Button-Element.You can define resources on any element, such as a Button. Ressourcen werden jedoch am häufigsten für das Stammelement definiert. In diesem Beispiel ist es eine Page.However, resources are most often defined on the root element, which is Page in the example.

Jeder Ressource in einem Ressourcenverzeichnis muss ein eindeutiger Schlüssel zugewiesen werden.Each resource in a resource dictionary must have a unique key. Wenn Sie Ressourcen in Markup definieren, weisen Sie den eindeutigen Schlüssel durch die x:Key-Anweisung zu.When you define resources in markup, you assign the unique key through the x:Key Directive. In der Regel ist der Schlüssel eine Zeichenfolge. Sie können jedoch den Schlüssel auch als einen anderen Objekttyp definieren, indem Sie die entsprechenden Markuperweiterungen verwenden.Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. Nichtzeichenfolgeschlüssel für Ressourcen werden von bestimmten Funktionsbereichen in WPF verwendet, insbesondere für Stile, Komponentenressourcen und Datenformatierung.Non-string keys for resources are used by certain feature areas in WPF, notably for styles, component resources, and data styling.

Sie können eine definierte Ressource mit der Syntax der Ressourcenmarkuperweiterung verwenden, die den Schlüsselnamen der Ressource angibt.You can use a defined resource with the resource markup extension syntax that specifies the key name of the resource. Verwenden Sie beispielsweise die Ressource als Wert einer Eigenschaft für ein anderes Element.For example, use the resource as the value of a property on another element.

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

Wenn im vorherigen Beispiel das XAML-Ladeprogramm den Wert {StaticResource MyBrush} für die Background-Eigenschaft für Button verarbeitet, überprüft die Ressourcennachschlagelogik zuerst das Ressourcenverzeichnis auf das Button-Element.In the preceding example, when the XAML 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. Wenn Button nicht über eine Definition des Ressourcenschlüssels MyBrush (in diesem Beispiel ist dies nicht der Fall, die Ressourcensammlung ist leer), überprüft die Nachschlagefunktion als nächstes das übergeordnete Element von Button, das Page ist.If Button doesn't have a definition of the resource key MyBrush (in that example it doesn't; its resource collection is empty), the lookup next checks the parent element of Button, which is Page. Wenn Sie eine Ressource für das Page-Stammelement definieren, können alle Elemente in der logischen Struktur des Page-Elements darauf zugreifen.If you define a resource on the Page root element, all the elements in the logical tree of the Page can access it. Und Sie können dieselbe Ressource wiederverwenden, um den Wert einer beliebigen Eigenschaft festzulegen, die denselben Typ akzeptiert, den die Ressource darstellt.And you can reuse the same resource for setting the value of any property that accepts the same type that the resource represents. Im vorherigen Beispiel legt die gleiche MyBrush-Ressource zwei unterschiedliche Eigenschaften fest: den Background eines Button-Elements und die Fill-Eigenschaft eines Rectangle.In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

Statische und dynamische RessourcenStatic and dynamic resources

Auf eine Ressource kann als statische oder dynamische Ressource verwiesen werden.A resource can be referenced as either static or dynamic. Verweise werden über die StaticResource-Markuperweiterung oder die DynamicResource-Markuperweiterung erstellt.References are created by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Eine Markuperweiterung ist eine XAML-Funktion, mit der Sie einen Objektverweis angeben können, indem die Markuperweiterung die Attributzeichenfolge verarbeitet und das Objekt an das XAML-Ladeprogramm zurückgibt.A markup extension is a XAML feature that lets you specify an object reference by having the markup extension process the attribute string and return the object to a XAML loader. Weitere Inforationen zum Verhalten von Markuperweiterungen finden Sie unter Markuperweiterungen und WPF-XAML.For more information about markup extension behavior, see Markup Extensions and WPF XAML.

Wenn Sie eine Markuperweiterung verwenden, geben Sie in der Regel einen oder mehrere Parameter im Zeichenfolgenformat an, die von dieser speziellen Markuperweiterung verarbeitet werden.When you use a markup extension, you typically provide one or more parameters in string form that are processed by that particular markup extension. Die StaticResource-Markuperweiterung verarbeitet einen Schlüssel, indem sie nach dem Wert für diesen Schlüssel in allen verfügbaren Ressourcenverzeichnissen sucht.The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. Die Verarbeitung erfolgt beim Laden, d. h., wenn der Ladeprozess den Eigenschaftswert zuweisen muss.Processing happens during load, which is when the loading process needs to assign the property value. Die DynamicResource-Markuperweiterung verarbeitet stattdessen einen Schlüssel, indem sie einen Ausdruck erstellt. Dieser Ausdruck wird nicht ausgewertet, bis die App ausgeführt wird. Zu diesem Zeitpunkt wird der Ausdruck ausgewertet und ergibt einen Wert.The DynamicResource Markup Extension instead processes a key by creating an expression, and that expression remains unevaluated until the app runs, at which time the expression is evaluated and provides a value.

Wenn Sie auf eine Ressource verweisen, sind bei der Wahl zwischen einem statischen und einem dynamischen Ressourcenverweis folgende Aspekte zu beachten:When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • Wenn Sie den allgemeinen Entwurf festlegen, wie Sie die Ressourcen für Ihre Anwendung erstellen (pro Seite, in der App, in „losem“ XAML oder in einer reinen Ressourcenassembly), sollten Sie Folgendes berücksichtigen:When determining the overall design of how you create the resources for your app (per page, in the app, in loose XAML, or in a resource-only assembly), consider the following:

  • Die Funktionalität der App.The app's functionality. Ist die Aktualisierung von Ressourcen in Echtzeit Bestandteil Ihrer Anwendungsanforderungen?Are updating resources in real-time part of your app requirements?

  • Das Suchverhalten des jeweiligen Ressourcenverweistyps.The respective lookup behavior of that resource reference type.

  • Jeweiliger Eigenschafts- oder Ressourcentyp sowie dessen natives Verhalten.The particular property or resource type, and the native behavior of those types.

Statische RessourcenStatic resources

Statische Ressourcenverweise funktionieren optimal unter folgenden Bedingungen:Static resource references work best for the following circumstances:

  • Der App-Entwurf konzentriert die meisten seiner Ressourcen in Ressourcenverzeichnissen auf Seiten- oder Anwendungsebene.Your app design concentrates most of its resources into page or application-level resource dictionaries. Statische Ressourcenverweise werden nicht basierend auf Laufzeitverhalten wie dem erneuten Laden einer Seite erneut ausgewertet.Static resource references aren't reevaluated based on runtime behaviors, such as reloading a page. Es kann also ein gewisser Leistungsvorteil entstehen, wenn Sie eine große Anzahl dynamischer Ressourcenverweise vermeiden, wenn diese aufgrund Ihres Ressourcen- und App-Entwurfs nicht erforderlich sind.So there can be some performance benefit to avoiding large numbers of dynamic resource references when they aren't necessary based on your resource and app design.

  • Sie legen den Wert einer Eigenschaft fest, die nicht für einen DependencyObject oder ein Freezable-Element ist.You're setting the value of a property that isn't on a DependencyObject or a Freezable.

  • Sie erstellen ein Ressourcenverzeichnis, das in eine DLL kompiliert und als ein Teil der App verpackt oder von mehreren Apps gemeinsam genutzt wird.You're creating a resource dictionary that will be compiled into a DLL and packaged as part of the app or shared between apps.

  • Sie erstellen ein Design für ein benutzerdefiniertes Steuerelement und definieren Ressourcen, die in den Designs verwendet werden.You're creating a theme for a custom control and are defining resources that are used within the themes. Für diesen Fall ist das Suchverhalten der dynamischen Verweise ungeeignet. Damit das Suchverhalten vorhersagbar und eigenständig für das Design gestaltet werden kann, sind statische Ressourcenverweise vorzuziehen.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. Bei einem dynamischen Ressourcenverweis wird sogar ein Verweis innerhalb eines Designs erst zur Laufzeit ausgewertet.With a dynamic resource reference, even a reference within a theme is left unevaluated until run-time. Daher besteht die Möglichkeit, dass bei der Anwendung des Designs ein Schlüssel, auf den das Design zu verweisen versucht, von einem lokalen Element neu definiert wird, und das lokale Element statt des Designs bei der Suche gefunden wird.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. In diesem Fall wird Ihr Design sich nicht wie erwartet verhalten.If that happens, your theme will not behave as expected.

  • Ressourcen werden verwendet, um die große Anzahl von Abhängigkeitseigenschaften festzulegen.You're using resources to set large numbers of dependency properties. Abhängigkeitseigenschaften können auf das effektive Zwischenspeichern von Werten des Eigenschaftensystems zugreifen. Wenn Sie einer Abhängigkeitseigenschaft einen Wert bereitstellen, der zur Ladezeit ausgewertet werden kann, ist keine Neuauswertung des Ausdrucks von der Abhängigkeitseigenschaft erforderlich. Sie kann den letzten effektiven Wert zurückgeben.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 doesn't have to check for a reevaluated expression and can return the last effective value. Mit diesem Verfahren kann ein Leistungsvorteil erzielt werden.This technique can be a performance benefit.

  • Sie möchten die zugrunde liegende Ressource für alle Consumer ändern oder für jeden einzelnen Consumer separate Instanzen mit Schreibzugriff unter Verwendung der x: Shared-Attribute verwalten.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.

Suchverhalten von statischen RessourcenStatic resource lookup behavior

Im Folgenden wird der Suchvorgang beschrieben, der automatisch erfolgt, wenn von einer Eigenschaft oder einem Element auf eine statische Ressource verwiesen wird:The following describes the lookup process that automatically happens when a static resource is referenced by a property or element:

  1. Der Suchprozess prüft den angeforderten Schlüssel im Ressourcenverzeichnis, das durch das Element definiert wird, das die Eigenschaft festlegt.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Der Suchprozess durchläuft anschließend die logische Struktur aufwärts zum übergeordneten Element und dessen Ressourcenverzeichnis.The lookup process then traverses the logical tree upward to the parent element and its resource dictionary. Dieser Vorgang wird fortgesetzt, bis das Stammelement erreicht wird.This process continues until the root element is reached.

  3. App-Ressourcen werden überprüft.App resources are checked. App-Ressourcen sind die Ressourcen im Ressourcenverzeichnis, die vom Application-Objekt für Ihre WPF-Anwendung definiert werden.App resources are those resources within the resource dictionary that is defined by the Application object for your WPF app.

Statische Ressourcenverweise innerhalb eines Ressourcenverzeichnisses müssen auf eine Ressource verweisen, die bereits vor dem Ressourcenverweis lexikalisch definiert worden ist.Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. Vorwärtsverweise können von einem statischen Ressourcenverweis nicht aufgelöst werden.Forward references cannot be resolved by a static resource reference. Gestalten Sie daher Ihre Ressourcenverzeichnisstruktur so, dass die Ressourcen am oder nahe dem Anfang des jeweiligen Ressourcenverzeichnisses definiert werden.For this reason, design your resource dictionary structure such that resources are defined at or near the beginning of each respective resource dictionary.

Statische Ressourcensuche kann auf Designs oder auf Systemressourcen ausgeweitet werden. Diese Suche wird aber nur aus dem Grund unterstützt, dass das XAML-Ladeprogramm die Anforderung verzögert.Static resource lookup can extend into themes or into system resources, but this lookup is supported only because the XAML loader defers the request. Die Verzögerung ist erforderlich, damit das Laufzeitdesign zum Zeitpunkt des Ladens der Seite ordnungsgemäß auf die App angewendet wird.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the app. Statische Ressourcenverweise auf Schlüssel, von denen bekannt ist, dass sie nur in Designs oder als Systemressourcen vorhanden sind, sind jedoch nicht zu empfehlen, da solche Verweise nicht erneut ausgewertet werden, wenn das Design vom Benutzer in Echtzeit geändert wird.However, static resource references to keys that are known to only exist in themes or as system resources aren't recommended, because such references aren't reevaluated if the theme is changed by the user in real time. Dynamische Ressourcenverweise sind zuverlässiger, wenn Sie Designs oder Systemressourcen abfragen.A dynamic resource reference is more reliable when you request theme or system resources. Eine Ausnahme bilden Abfragen, bei denen ein Designelement selbst andere Ressourcen abfragt.The exception is when a theme element itself requests another resource. Diese Verweise sind aus den oben genannten Gründen als statische Ressourcenverweise zu definieren.These references should be static resource references, for the reasons mentioned earlier.

Falls statistische Verweise nicht gefunden werden, sind verschiedene Ausnahmeverhaltensmuster möglich.The exception behavior if a static resource reference isn't found varies. Falls die Ressource verzögert wurde, tritt die Ausnahme zur Laufzeit ein.If the resource was deferred, then the exception occurs at runtime. Falls die Ressource nicht verzögert wurde, tritt die Ausnahme zur Ladezeit ein.If the resource was not deferred, the exception occurs at load time.

Dynamische RessourcenDynamic resources

Dynamische Ressourcen funktionieren am besten, wenn Folgendes gilt:Dynamic resources work best when:

  • Der Wert der Ressource, einschließlich der Systemressourcen oder Ressourcen, die anderweitig vom Benutzer festgelegt werden können, hängt von Bedingungen ab, die erst zur Laufzeit bekannt sind.The value of the resource, including system resources, or resources that are otherwise user settable, depends on conditions that aren't known until runtime. Beispielsweise können Sie Setterwerte erstellen, die sich auf Systemeigenschaften beziehen, wie sie durch SystemColors, SystemFonts oder SystemParameters offengelegt werden.For example, you can create setter values that refer to system properties as exposed by SystemColors, SystemFonts, or SystemParameters. Diese Werte sind wirklich dynamisch, da sie letztlich von der Laufzeitumgebung des Benutzers und dem Betriebssystem stammen.These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. Möglicherweise haben Sie außerdem Designs auf der Anwendungsebene, die sich ändern können, und deren Veränderungen auch vom Ressourcenzugriff auf der Seitenebene erfasst werden müssen.You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • Sie erstellen Designstile für ein benutzerdefiniertes Steuerelement oder verweisen darauf.You're creating or referencing theme styles for a custom control.

  • Sie beabsichtigen, den Inhalt eines ResourceDictionary-Elements während der Lebensdauer einer App anzupassen.You intend to adjust the contents of a ResourceDictionary during an app lifetime.

  • Sie haben eine komplizierte Ressourcenstruktur mit gegenseitigen Abhängigkeiten, die möglicherweise Vorwärtsverweise erfordert.You have a complicated resource structure that has interdependencies, where a forward reference may be required. Im Gegensatz zu statischen Ressourcenverweisen, unterstützen dynamische Ressourcenverweise Vorwärtsverweise, da die Ressource erst zur Laufzeit ausgewertet werden muss, und Vorwärtsverweise daher kein relevantes Konzept sind.Static resource references do not support forward references, but dynamic resource references do support them because the resource doesn't need to be evaluated until runtime, and forward references are therefore not a relevant concept.

  • Sie verweisen auf eine Ressource, die aus der Perspektive eines kompilieren oder Arbeitssatzes groß ist, und möglicherweise beim Laden der Seite nicht sofort verwendet wird.You're referencing a resource that is large from the perspective of a compile or working set, and the resource might not be used immediately when the page loads. Statische Ressourcenverweise werden immer aus XAML geladen, wenn die Seite geladen wird.Static resource references always load from XAML when the page loads. Ein dynamischer Ressourcenverweis wird jedoch erst geladen, wenn er verwendet wird.However, a dynamic resource reference doesn't load until it's used.

  • Sie erstellen einen Stil, bei dem Setterwerte von anderen Werten stammen könnten, die durch Designs oder andere Benutzereinstellungen beeinflusst werden.You're creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • Sie ordnen Ressourcen Elementen zu, die in der logischen Struktur während der Lebensdauer der App neu zugeordnet werden können.You're applying resources to elements that might be reparented in the logical tree during app lifetime. Beim erneuten Zuordnen der Elemente wird möglicherweise auch der Ressourcensuchbereich neu definiert. Wenn Sie wollen, dass die Ressource für ein neu zugeordnetes Element entsprechend dem neuen Suchbereich neu ausgewertet wird, verwenden Sie immer einen dynamischen Ressourcenverweis.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.

Suchverhalten von dynamischen RessourcenDynamic resource lookup behavior

Das Verhalten der Ressourcensuche für einen dynamischen Ressourcenverweis weist Parallelen zum Nachschlageverhalten in Ihrem Code auf, wenn Sie FindResource oder SetResourceReference aufrufen:Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference:

  1. Die Suche prüft den angeforderten Schlüssel im Ressourcenverzeichnis, das durch das Element definiert wird, das die Eigenschaft festlegt:The lookup checks for the requested key within the resource dictionary defined by the element that sets the property:

  2. Die Suche durchläuft die logische Struktur aufwärts bis zum übergeordneten Element und dessen Ressourcenverzeichnis.The lookup traverses the logical tree upward to the parent element and its resource dictionary. Dieser Vorgang wird fortgesetzt, bis das Stammelement erreicht wird.This process continues until the root element is reached.

  3. App-Ressourcen werden überprüft.App resources are checked. App-Ressourcen sind die Ressourcen im Ressourcenverzeichnis, die vom Application-Objekt für Ihre WPF-Anwendung definiert werden.App resources are those resources within the resource dictionary that are defined by the Application object for your WPF app.

  4. Das Ressourcenverzeichnis des Designs wird für das derzeit aktive Design überprüft.The theme resource dictionary is checked for the currently active theme. Falls das Design zur Laufzeit geändert wird, wird der Wert neu ausgewertet.If the theme changes at runtime, the value is reevaluated.

  5. Systemressourcen werden geprüft.System resources are checked.

Es sind verschiedene Ausnahmeverhaltensmuster möglich (sofern sie auftreten):Exception behavior (if any) varies:

  • Wenn eine Ressource von einem FindResource-Aufruf angefordert und nicht gefunden wurde, wird eine Ausnahme ausgelöst.If a resource was requested by a FindResource call and was not found, an exception is thrown.

  • Wenn eine Ressource von einem TryFindResource-Aufruf angefordert und nicht gefunden wurde, wird keine Ausnahme ausgelöst, und der zurückgegebene Wert ist null.If a resource was requested by a TryFindResource call and was not found, no exception is thrown, and the returned value is null. Wenn die festzulegende Eigenschaft null nicht akzeptiert, ist es dennoch möglich, dass eine tiefere Ausnahme ausgelöst wird. Dies hängt von der jeweiligen Eigenschaft ab, die festgelegt wird.If the property being set doesn't accept null, then it's still possible that a deeper exception will be thrown, depending on the individual property being set.

  • Wenn eine Ressource von einem dynamischen Ressourcenverweis in XAML angefordert und nicht gefunden wurde, hängt das Verhalten vom allgemeinen Eigenschaftensystem ab.If a resource was requested by a dynamic resource reference in XAML and was not found, then the behavior depends on the general property system. Das allgemeine Verhalten ist so, als ob auf der Ebene, auf der die Ressource vorhanden ist, kein Vorgang zum Festlegen von Eigenschaften stattfindet.The general behavior is as if no property setting operation occurred at the level where the resource exists. Wenn Sie z. B. versuchen, den Hintergrund eines einzelnen Schaltflächenelements mit einer Ressource festzulegen, die nicht ausgewertet werden konnte, wird als Ergebnis kein Wert festgelegt. Ein effektiver Wert kann aber dennoch von anderen Teilnehmern im Eigenschaftssystem und in der Wertrangfolge bereitgestellt werden.For instance, if you attempt to set the background on 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. Beispielsweise kann der Wert für den Hintergrund von einem lokal definierten Schaltflächenstil oder vom Designstil zurückgegeben werden.For instance, the background value might still come from a locally defined button style or from the theme style. Für Eigenschaften, die nicht von Designstilen definiert werden, kann nach einer fehlgeschlagenen Auswertung der Standardwert aus den Eigenschaftenmetadaten als effektiver Wert übernommen werden.For properties that aren't defined by theme styles, the effective value after a failed resource evaluation might come from the default value in the property metadata.

BeschränkungenRestrictions

Die Verwendung dynamischer Verweise ist mit einigen wichtigen Beschränkungen verbunden.Dynamic resource references have some notable restrictions. Mindestens eine der folgenden Bedingungen muss erfüllt sein:At least one of the following conditions must be true:

Da die festzulegende Eigenschaft eine DependencyProperty- oder eine Freezable-Eigenschaft sein muss, können die meisten Eigenschaftsänderungen an die Benutzeroberfläche weitergeleitet werden, da Eigenschaftsänderungen (die Werte der geänderten dynamischen Ressourcen) vom Eigenschaftensystem anerkannt werden.Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to the UI because a property change (the changed dynamic resource value) is acknowledged by the property system. Die meisten Steuerelemente enthalten eine Logik, die ein anderes Layout eines Steuerelements erzwingt, wenn eine DependencyProperty geändert wird, und diese Eigenschaft sich auf das Layout auswirken könnte.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Allerdings ist nicht für alle Eigenschaften, die eine DynamicResource-Markuperweiterung als Wert aufweisen, garantiert, dass sie Echtzeitaktualisierungen in der Benutzeroberfläche bereitstellen.However, not all properties that have a DynamicResource Markup Extension as their value are guaranteed to provide real time updates in the UI. Diese Funktionalität kann dennoch variieren, abhängig sowohl von der Eigenschaft als auch vom Typ, der die Eigenschaft besitzt oder sogar von der logischen Struktur Ihrer App.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 app.

Stile, DataTemplates und implizite SchlüsselStyles, DataTemplates, and implicit keys

Obwohl alle Elemente in einem ResourceDictionary-Element über einen Schlüssel verfügen müssen, bedeutet das nicht, dass alle Ressourcen über einen expliziten x:Keyverfügen müssen.Although all items in a ResourceDictionary must have a key, that doesn't mean that all resources must have an explicit x:Key. Manche Objekttypen unterstützen einen impliziten Schlüssel, wenn sie als Ressourcen definiert sind, wobei der Schlüsselwert an den Wert einer anderen Eigenschaft gebunden ist.Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. Dieser Schlüsseltyp wird als impliziter Schlüssel bezeichnet, während ein x:Key-Attribut ein expliziter Schlüssel ist.This type of key is known as an implicit key, whereas an x:Key attribute is an explicit key. Sie können jegliche implizite Schlüssel durch die Angabe eines expliziten Schlüssels überschreiben.You can overwrite any implicit key by specifying an explicit key.

Ein besonders wichtiges Szenario für Ressourcen ist das Definieren eines Style.One important scenario for resources is when you define a Style. Tatsächlich ist ein Style fast immer als ein Eintrag in einem Ressourcenverzeichnis definiert, da Stile grundsätzlich zur Wiederverwendung vorgesehen sind.In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. Weitere Informationen zu Stilen finden Sie unter Erstellen von Formaten und Vorlagen.For more information about styles, see Styling and Templating.

Mit einem impliziten Schlüssel können Stile für Steuerelemente erstellt werden, und es kann damit auf sie verwiesen werden.Styles for controls can be both created with and referenced with an implicit key. Die Design-Stile, die die Standarddarstellung eines Steuerelements definieren, basieren auf diesen impliziten Schlüsseln.The theme styles that define the default appearance of a control rely on this implicit key. Aus Sicht der Anforderung ist der implizite Schlüssel der Type des Steuerelements selbst.From the standpoint of requesting it, the implicit key is the Type of the control itself. Unter dem Gesichtspunkt der Definition der Ressourcen ist der implizite Schlüssel der TargetType des Stils.From the standpoint of defining the resources, the implicit key is the TargetType of the style. Wenn Sie daher Designs für benutzerdefinierte Steuerelemente oder Stile erstellen, die mit vorhandenen Design-Stilen interagieren, müssen Sie keine x:Key-Anweisung für diesen Style angeben.Therefore, if you're creating themes for custom controls or creating styles that interact with existing theme styles, you do not need to specify an x:Key Directive for that Style. Und wenn Sie die Design-Stile verwenden möchten, müssen Sie gar keinen Stil angeben.And if you want to use the themed styles, you do not need to specify any style at all. Beispielsweise funktioniert die folgende Definition eines Stils, obwohl die Style-Ressource nicht über einen Schlüssel zu verfügen scheint:For instance, the following style definition works, even though the Style resource doesn't 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>

Dieser Stil besitzt aber tatsächlich einen Schlüssel: den impliziten Schlüssel typeof(System.Windows.Controls.Button).That style really does have a key: the implicit key typeof(System.Windows.Controls.Button). Im Markup können Sie einen TargetType direkt als den Typnamen angeben (optional können Sie {x:Type...} verwenden,In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} damit ein Type zurückgegeben wird.to return a Type.

Durch die von WPF verwendeten Standardmechanismen für Designstile wird dieser Stil als Laufzeitstil eines Button-Elements auf der Seite angewendet, auch wenn das Button-Element selbst nicht versucht, seine Style-Eigenschaft oder einen spezifischen Ressourcenverweis auf den Stil anzugeben.Through the default theme style mechanisms used by WPF, that style is applied as the runtime style of a Button on the page, even though the Button itself doesn't attempt to specify its Style property or a specific resource reference to the style. Ihr auf dieser Seite definierter Stil wird unter der Verwendung des selben Schlüssels in der Suchsequenz früher als der Stil des Designverzeichnisses gefunden.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. Sie könnten <Button>Hello</Button> an einer beliebigen Stelle auf der Seite anlegen, und der mit TargetType von Button definierte Stil würde auf diese Schaltfläche angewendet werden.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. Wenn Sie möchten, können Sie für den Stil dennoch aus Gründen der Übersichtlichkeit den Schlüssel mit demselben Typwert wie TargetType angeben. Das ist allerdings nur eine Option.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.

Implizite Schlüssel für Stile gelten nicht für ein Steuerelement, wenn OverridesDefaultStyle true ist.Implicit keys for styles do not apply on a control if OverridesDefaultStyle is true. (Beachten Sie auch, dass OverridesDefaultStyle als Teil des nativen Verhaltens für die Steuerelementklasse und nicht explizit für eine Instanz des Steuerelements festgelegt werden kann.) Um implizite Schlüssel für Szenarien mit abgeleiteten Klassen zu unterstützen, muss das Steuerelement DefaultStyleKey außer Kraft setzen (alle vorhandenen Steuerelemente, die mit WPF bereitgestellt werden, enthalten diese Außerkraftsetzung).(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.) Also, in order to support implicit keys for derived class scenarios, the control must override DefaultStyleKey (all existing controls provided as part of WPF include this override). Weitere Informationen zu Stilen, Designs und dem Steuerelemententwurf finden Sie unter Richtlinien zum Entwerfen formatierbarer Steuerelemente.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplate verfügt auch über einen impliziten Schlüssel.DataTemplate also has an implicit key. Der implizite Schlüssel für eine DataTemplate ist der DataType-Eigenschaftswert.The implicit key for a DataTemplate is the DataType property value. DataType kann auch als der Name des Typs angegeben werden, anstatt {x:Type...} explizit zu verwenden.DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. Weitere Informationen finden Sie unter Übersicht über Datenvorlagen.For details, see Data Templating Overview.

Siehe auchSee also