XAML-RessourcenXAML Resources

Eine Ressource ist ein Objekt, das an unterschiedlichen Stellen in der Anwendung erneut verwendet werden kann.A resource is an object that can be reused in different places in your application. Beispiele für Ressourcen sind Pinsel und Stile.Examples of resources include brushes and styles. In dieser Übersicht wird beschrieben, wie Ressourcen in XAMLXAML.This overview describes how to use resources in XAMLXAML. Sie können auch Zugriff auf Ressourcen mithilfe von Code oder abwechselnd zwischen Code und Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML).You can also create and access resources by using code, or interchangeably between code and Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML). Weitere Informationen finden Sie unter Ressourcen und Code.For more information, see Resources and Code.

Hinweis

Die in diesem Thema beschriebenen Ressourcendateien unterscheiden, als die Ressourcendateien im beschrieben WPF-Anwendungsressource, Inhalt und Datendateien und unterscheidet sich die eingebetteten oder verknüpften Ressourcen, die in beschriebenen verwalten Ressourcen der Anwendung (.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).

Verwendung von Ressourcen in XAMLUsing Resources in XAML

Das folgende Beispiel definiert eine SolidColorBrush als Ressource für das Stammelement einer Seite.The following example defines a SolidColorBrush as a resource on the root element of a page. Anschließend verweist auf die Ressource und wird verwendet, um die Eigenschaften mehrerer untergeordneter Elemente, einschließlich einer Ellipse, TextBlock, und ein Button.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 der Frameworkebene (FrameworkElement oder FrameworkContentElement) verfügt über eine Resources -Eigenschaft, die die Eigenschaft ist die Ressourcen enthält (als eine ResourceDictionary), die eine Ressource definiert.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. Sie können Ressourcen für beliebige Elemente definieren.You can define resources on any element. Ressourcen werden jedoch am häufigsten definiert, für das Stammelement, d.h. Page im Beispiel.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 Directive.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 verwendet, von bestimmten Funktionsbereichen in WPFWPF, insbesondere für Stile, Komponentenressourcen und datenformatierung.Nonstring keys for resources are used by certain feature areas in WPFWPF, notably for styles, component resources, and data styling.

Nachdem Sie eine Ressource definiert haben, können Sie einen Eigenschaftswert auf sie verweisen, indem Sie eine Markuperweiterungssyntax für Ressourcen verwenden, die den Schlüsselnamen angibt, zum Beispiel: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}"/>

Im vorherigen Beispiel wenn die XAMLXAML Ladeprogramm verarbeitet den Wert {StaticResource MyBrush} für die Background Eigenschaft Button, Suchlogik der Ressource überprüft zunächst das Ressourcenverzeichnis der Button Element.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. Wenn Button verfügt nicht über eine Definition des Ressourcenschlüssels MyBrush (nicht der Fall, die ressourcenauflistung ist leer), die Suche als Nächstes überprüft das übergeordnete Element des Button, d.h. Page.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. Daher beim Definieren einer Ressourcensatzes auf die Page Stammelement, das alle Elemente in der logischen Struktur des der Page darauf zugreifen können, und Sie können die gleiche Ressource wiederverwenden, für den Wert einer beliebigen Eigenschaft festlegen, akzeptiert die Type , die die Ressource Stellt die dar.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. Im vorherigen Beispiel identisch MyBrush Ressourcensätze zwei unterschiedliche Eigenschaften: die Background von einer Button, und die Fill von eine 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

Es kann entweder auf statische oder auf dynamische Ressourcen verwiesen werden.A resource can be referenced as either a static resource or a dynamic resource. Dies erfolgt mithilfe der StaticResource-Markuperweiterung oder DynamicResource-Markuperweiterung.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Eine Markuperweiterung ist ein Feature von XAMLXAML , wobei Sie einen Objektverweis angeben können, indem die Markuperweiterung die Attributzeichenfolge verarbeitet und das Objekt, das Zurückgeben einer XAMLXAML Ladeprogramm.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. Weitere Informationen über das Markuperweiterungsverhalten 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, und nicht im Kontext der festzulegenden Eigenschaft ausgewertet 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, rather than being evaluated in the context of the property being set. Die StaticResource-Markuperweiterung verarbeitet einen Schlüssel, indem Sie den 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. Dies geschieht beim Laden, d.h. zu dem Zeitpunkt, während der Ladeprozess dem statischen Ressourcenverweis einen Eigenschaftswert zuweisen muss.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. Die DynamicResource-Markuperweiterung stattdessen Prozesse ein Schlüssel durch Erstellen eines Ausdrucks und diesen Ausdruck nicht die Anwendung tatsächlich ausgeführt wird, bis zu diesem Zeitpunkt der Ausdruck wird ausgewertet, und gibt einen Wert an.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.

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:

  • Der allgemeine Entwurf, wie Sie die Ressourcen für Ihre Anwendung erstellen (pro Seite, in der Anwendung, in loser XAMLXAML, in einer reinen Ressourcenassembly).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).

  • Die Funktionalität der Anwendung: ist das Aktualisieren von Ressourcen in Echtzeit ein Teil der Anforderungen an Ihre Anwendung?The application functionality: is updating resources in real time part of your application 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 Anwendungsentwurf behandelt die meisten Ressourcen auf der Seiten- oder Anwendungsebene.Your application design concentrates most of all of its resources into page or application level resource dictionaries. Statische Ressourcenverweise werden nicht basierend auf dem Laufzeitverhalten neu bewertet, z.B. beim Neuladen einer Seite. Daher kann durch die Verwendung statischer Ressourcenverweise ein Leistungsvorteil erzielt werden, da eine Vielzahl von dynamischen Verweisen vermieden wird, die nicht für Ihren Ressourcen- oder Anwendungsentwurf erforderlich sind.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.

  • Legen Sie den Wert einer Eigenschaft, die nicht auf eine DependencyObject oder Freezable.You are setting the value of a property that is not on a DependencyObject or a Freezable.

  • Sie erstellen ein Ressourcenverzeichnis, das in eine DLL kompiliert und als ein Teil der Anwendung verpackt oder von mehreren Anwendungen gemeinsam genutzt wird.You are creating a resource dictionary that will be compiled into a DLL, and packaged as part of the application or shared between applications.

  • Sie erstellen ein Design für ein benutzerdefiniertes Steuerelement und definieren Ressourcen, die in den Designs verwendet werden.You are 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. Dynamische Ressourcenverweise werden bis zur Laufzeit nicht ausgewertet. Es betrifft auch die Verweise innerhalb des Designs. 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.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. In diesem Fall wird Ihr Design sich nicht wie erwartet verhalten.If that happens, your theme will not behave in an expected manner.

  • Ressourcen werden verwendet, um die große Anzahl von Abhängigkeitseigenschaften festzulegen.You are 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 does not 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.

  • Die zugrunde liegende Ressource für alle Consumer ändern möchten, oder Sie separate Instanzen mit Schreibzugriff für jeden Consumer mit beibehalten möchten die X: Shared-Attribut.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

  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 seinem Ressourcenverzeichnis.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Die Suche wird fortgesetzt, bis das Stammelement erreicht ist.This continues until the root element is reached.

  3. Als nächstes werden die Anwendungsressourcen geprüft.Next, application resources are checked. Anwendungsressourcen sind die Ressourcen im Ressourcenverzeichnis, das nach definiert ist die Application Objekt für Ihre WPFWPF Anwendung.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

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. Wenn Sie statische Ressourcenverweise verwenden, müssen Sie daher die Struktur des Ressourcenverzeichnisses so entwerfen, dass Ressourcen, die durch andere Ressourcen verwendet werden können, zu Beginn der jeweiligen Ressourcenverweise definiert werden.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.

Statische Ressourcensuche kann auf Designs oder auf Systemressourcen zu erweitern, aber dies wird unterstützt, da die XAMLXAML Ladeprogramm die Anforderung verzögert.Static resource lookup can extend into themes, or into system resources, but this is supported only because the XAMLXAML loader defers the request. Die Verzögerung ist zwecks einer ordnungsgemäßen Anwendung des Laufzeit-Designs zu dem Zeitpunkt, als die Seite geladen ist, erforderlich.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the application. Jedoch ist von statischen Ressourcenverweisen auf Schlüssel abzuraten, die nur in Designs oder als Systemressourcen vorkommen.However, static resource references to keys that are known to only exist in themes or as system resources are not recommended. Der Grund hierfür ist, dass solche Verweise nicht neu ausgewertet werden, falls ein Benutzer das Design in Echtzeit ändert.This is because such references are not reevaluated if the theme is changed by the user in realtime. 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 is not 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 Ressourcenverweise funktionieren optimal unter folgenden Bedingungen:Dynamic resources work best for the following circumstances:

  • Der Wert der Ressource hängt von Bedingungen ab, die bis zur Laufzeit unbekannt sind.The value of the resource depends on conditions that are not known until runtime. Dies schließt Systemressourcen und Ressourcen ein, die andernfalls vom Benutzer festgelegt werden.This includes system resources, or resources that are otherwise user settable. Sie können z. B. Setter-Werte, die auf Systemeigenschaften verweisen erstellen, wie vom SystemColors, SystemFonts, oder SystemParameters.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 are creating or referencing theme styles for a custom control.

  • Sie beabsichtigen, passen Sie den Inhalt einer ResourceDictionary während der Lebensdauer einer Anwendung.You intend to adjust the contents of a ResourceDictionary during an application 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. Statische Ressourcenverweise Vorwärtsverweise, nicht unterstützt, aber dynamische Ressourcenverweise unterstützen, da die Ressource nicht bis zur Laufzeit ausgewertet werden muss, und Vorwärtsverweise sind daher kein relevantes Konzept.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.

  • Sie verweisen auf eine Ressource, die aus der Perspektive eines kompilieren oder Arbeitssatzes besonders groß ist, und möglicherweise beim Laden der Seite nicht sofort verwendet wird.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. Statische Ressourcenverweise werden immer von XAMLXAML beim Laden der Seite, jedoch ein dynamischen Ressourcenverweis wird nicht geladen, bis er tatsächlich verwendet wird.Static resource references always load from XAMLXAML when the page loads; however, a dynamic resource reference does not load until it is actually used.

  • Sie erstellen einen Stil, bei dem Setter-Werte von anderen Werten stammen könnten, die durch Designs oder andere Benutzereinstellungen beeinflusst werden.You are 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 Anwendung neu zugeordnet werden können.You are applying resources to elements that might be reparented in the logical tree during application 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

Suchverhalten von Ressourcen für einen dynamischen Ressourcenverweis entspricht dem Suchverhalten in Ihrem Code aus, wenn Sie aufrufen FindResource oder SetResourceReference.Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference.

  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. Die Suche wird fortgesetzt, bis das Stammelement erreicht ist.This continues until the root element is reached.

  3. Als nächstes werden die Anwendungsressourcen geprüft.Next, application resources are checked. Anwendungsressourcen sind die Ressourcen im Ressourcenverzeichnis, das nach definiert ist die Application Objekt für Ihre WPFWPF Anwendung.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

  4. Das Ressourcenverzeichnis des Designs wird für das derzeit aktive Design überprüft.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, indem angefordert wurde eine FindResource aufrufen 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 raised.

  • Wenn eine Ressource, indem angefordert wurde eine TryFindResource aufrufen und nicht gefunden wurde, wird keine Ausnahme ausgelöst, aber der zurückgegebene Wert ist null.If a resource was requested by a TryFindResource call, and was not found, no exception is raised, but the returned value is null. Wenn die festgelegte Eigenschaft wird nicht akzeptiert null, ist es weiterhin möglich, dass eine tiefere Ausnahme ausgelöst wird (Dies hängt von der jeweiligen Eigenschaft festgelegt wird).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).

  • Wenn eine Ressource, von einem dynamischen Ressourcenverweis in angefordert wurde XAMLXAML, und nicht gefunden wurde, und klicken Sie dann das Verhalten hängt vom allgemeinen Eigenschaftensystem, aber das übliche Verhalten ist, als ob keine eigenschafteneinstellung auf der Ebene vorgenommen, in dem die Ressource vorhanden ist.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. 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 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. Beispielsweise kann der Wert für den Hintergrund von einem lokal definierten Schaltflächenstil oder vom Design-Stil 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 Design-Stilen definiert werden, kann nach einer fehlgeschlagenen Auswertung der Standardwert aus den Eigenschaftenmetadaten als effektiver Wert übernommen werden.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.

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 must be true:

Da die festzulegende Eigenschaft sein, muss ein DependencyProperty oder Freezable -Eigenschaft, die meisten eigenschaftsänderungen können weitergegeben werden auf der Benutzeroberfläche, da die Änderung einer Eigenschaft (der Wert der geänderten dynamischen Ressourcen) vom Eigenschaftensystem bestätigt wird.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. Die meisten Steuerelemente enthalten Logik, die ein anderes Layout eines Steuerelements erzwungen wird, wenn eine DependencyProperty ändert, und diese Eigenschaft die Layout beeinflussen kann.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Allerdings nicht alle Eigenschaften, die haben einen DynamicResource-Markuperweiterung als ihren Wert ist garantiert, dass den Wert in einer Weise angeben, dass er in Echtzeit in der Benutzeroberfläche aktualisiert.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. 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 Anwendung.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.

Stile, Datenvorlagen und implizite SchlüsselStyles, DataTemplates, and Implicit Keys

Es wurde bereits angemerkt, dass alle Elemente in einem ResourceDictionary muss einen Schlüssel haben.Earlier, it was stated that all items in a ResourceDictionary must have a key. Aber dies bedeutet nicht, dass alle Ressourcen eine explizite müssen x:Key.However, that does not 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. Dies wird als impliziter Schlüssel bezeichnet, während ein x:Key -Attribut ist ein expliziter Schlüssel.This 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 beim Definieren einer Style.One very important scenario for resources is when you define a Style. In der Tat ein Style ist fast immer als 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 Stile 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. Ist der implizite Schlüssel aus der Sicht der Anforderung der Type des Steuerelements selbst.The implicit key from the standpoint of requesting it is the Type of the control itself. Ist der implizite Schlüssel aus Sicht der Ressourcendefinition die TargetType des Stils.The implicit key from the standpoint of defining the resource is the TargetType of the style. Aus diesem Grund bei der Erstellung Designs für benutzerdefinierte Steuerelemente, Stile erstellen, die Interaktion mit vorhandenen Design-Stilen, Sie nicht müssen an einem X: Key Directive , Style.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. 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. Z. B. die folgenden Formatdefinition funktioniert, obwohl die Style Ressource wird nicht angezeigt, um einen Schlüssel zu erhalten: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>

Dieser Stil verfügt tatsächlich über einen Schlüssel: den impliziten Schlüssel typeof( Button ).That style really does have a key: the implicit key typeof(Button). Im Markup können Sie angeben einer TargetType direkt als Typ benannt (oder Sie können optional {X: Type...}In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} Zurückgeben einer Type.to return a Type.

Mithilfe der standardmäßigen Design Stil Mechanismen ein, die WPFWPF, dass der Stil angewendet wird, als der Stil für die Laufzeit von ein Button auf der Seite, obwohl die Button selbst wird nicht versucht, an die Style Eigenschaft oder eine bestimmte Ressource Ein Verweis auf das Format.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. Die Formatvorlage definiert wird, auf der Seite befindet sich weiter oben in der Suchsequenz als Wörterbuch Designstil, mit dem gleichen Schlüssel, den dem Wörterbuch Designstil verfügt.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. Geben Sie einfach <Button>Hello</Button> an einer beliebigen Stelle in der Seite und den Stil, die Sie mit definiert TargetType von Button würde auf diese Schaltfläche angewendet.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 dennoch einen expliziten Schlüssel für den Stil mit demselben Typwert wie TargetTypefür Klarheit in das Markup, aber dies optional ist.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 werden nicht auf ein Steuerelement angewendet, wenn OverridesDefaultStyle ist true (Beachten Sie, dass OverridesDefaultStyle möglicherweise als Teil des nativen Verhaltens für die Control-Klasse, und nicht explizit in einer Instanz des Steuerelements festgelegt werden).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). Darüber hinaus um implizite Schlüssel für Szenarios mit abgeleiteten Klassen zu unterstützen, das Steuerelement muss außer Kraft setzen DefaultStyleKey (alle existierenden Steuerelemente als Teil des WPFWPF dazu).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). Weitere Informationen zu Stilen, Designs und Entwurf von Steuerelementen finden Sie unter Richtlinien zum Entwerfen formatierbarer Steuerelemente.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplate Außerdem verfügt über einen impliziten Schlüssel ein.DataTemplate also has an implicit key. Der implizite Schlüssel für eine DataTemplate ist die DataType -Eigenschaftswert.The implicit key for a DataTemplate is the DataType property value. DataType kann auch als Name des Typs angegeben werden, nicht explizit mit {X: Type...} .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