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 XAMLXAMLin verwendet werden.This overview describes how to use resources in XAMLXAML. Sie können auch Ressourcen erstellen und auf diese zugreifen, indem Sie Code verwenden oder zwischen Code und Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)austauschen.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 Ressourcen Dateien unterscheiden sich von den Ressourcen Dateien, die in WPF-Anwendungs Ressource, Inhalts-und Datendateien beschrieben werden, und unterscheiden sich von den in Verwalten von Anwendungs Ressourcen (.net) beschriebenen eingebetteten oder verknüpften Ressourcen. .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

Im folgenden Beispiel wird eine SolidColorBrush als Ressource für das Stamm Element einer Seite definiert.The following example defines a SolidColorBrush as a resource on the root element of a page. Im Beispiel wird dann auf die Ressource verwiesen und zum Festlegen von Eigenschaften mehrerer untergeordneter Elemente verwendet, Ellipseeinschließlich TextBlock,, und 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 auf Frameworkebene FrameworkContentElement(FrameworkElement oder) Resources verfügt über eine-Eigenschaft, die die- ResourceDictionaryEigenschaft enthält, die die von einer Ressource definierten Ressourcen (als) enthält.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. Allerdings werden Ressourcen am häufigsten für das root-Element definiert, das Page im Beispiel ist.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 im Markup definieren, weisen Sie den eindeutigen Schlüssel über die x:Key-Direktivezu.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. Nicht-Zeichen folgen Schlüssel für Ressourcen werden von bestimmten Featurebereichen in WPFWPFverwendet, insbesondere bei Stilen, Komponenten Ressourcen und Datenformaten.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}"/>

Wenn XAMLXAML im vorherigen Beispiel das Lade Programm den Wert {StaticResource MyBrush} für die Background -Eigenschaft auf Buttonverarbeitet, überprüft die Ressourcen Suchlogik zuerst das Ressourcen Wörterbuch auf Button das-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 nicht über eine Definition des Ressourcen Schlüssels MyBrush verfügt (Dies ist nicht der Fall, die Ressourcensammlung ist leer), überprüft die Suche als nächstes das übergeordnete Button PageElement von, d. h.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. Wenn Sie also eine Ressource für das Page Stamm Element definieren, Page können alle Elemente in der logischen Struktur von darauf zugreifen, und Sie können dieselbe Ressource wieder verwenden, um den Wert einer beliebigen Eigenschaft festzulegen, die das Type -Objekt akzeptiert, das die Ressource ist.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 MyBrush Beispiel legt die gleiche Ressource zwei unterschiedliche Eigenschaften fest: die Background eines Buttonund die Fill 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

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 statikresource-Markup Erweiterung oder der dynamikresource-Markup Erweiterung.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Eine Markup Erweiterung ist eine Funktion von XAMLXAML , mit der Sie einen Objekt Verweis angeben können, indem die Markup Erweiterung die Attribut Zeichenfolge verarbeitet und das XAMLXAML Objekt an ein Lade Modul zurückgibt.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 zum Markup Erweiterungs Verhalten finden Sie unter Markup Erweiterungen 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 statikresource-Markup Erweiterung verarbeitet einen Schlüssel, indem er in allen verfügbaren Ressourcen Wörterbüchern den Wert für diesen Schlüssel 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 dynamikresource-Markup Erweiterung verarbeitet stattdessen einen Schlüssel, indem ein Ausdruck erstellt wird. dieser Ausdruck wird nicht ausgewertet, bis die Anwendung tatsächlich ausgeführt wird. zu diesem Zeitpunkt wird der Ausdruck ausgewertet und stellt einen Wert bereit.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 Gesamtentwurf der Art und Weise, wie Sie die Ressourcen für Ihre Anwendung erstellen (pro Seite, in der XAMLXAMLAnwendung in Lose, 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.

  • Sie legen den Wert einer Eigenschaft fest, die sich nicht in einem DependencyObject oder einem Freezablebefindet.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.

  • Sie möchten die zugrunde liegende Ressource für alle Consumer ändern, oder Sie möchten separate beschreibbare Instanzen für jeden Consumer mithilfe des x:Shared-Attributsverwalten.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. Anwendungs Ressourcen sind Ressourcen innerhalb des Ressourcen Wörterbuchs, das durch das Application -Objekt WPFWPF für die Anwendung definiert wird.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.

Die statische Ressourcen Suche kann in Designs oder Systemressourcen erweitert werden. Dies wird jedoch nur unterstützt, da XAMLXAML das Lade Modul die Anforderung absetzt.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. Beispielsweise können Sie Setter-Werte erstellen, die auf Systemeigenschaften verweisen, die von SystemColors, SystemFontsoder SystemParametersverfügbar gemacht 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 are creating or referencing theme styles for a custom control.

  • Sie beabsichtigen, den Inhalt einer ResourceDictionary während der Lebensdauer einer Anwendung anzupassen.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 Ressourcen Verweise unterstützen keine Forward-Verweise, aber dynamische Ressourcen Verweise unterstützen diese, da die Ressource nicht bis zur Laufzeit ausgewertet werden muss und vorwärts Verweise daher kein relevantes Konzept sind.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 Ressourcen Verweise werden immer aus XAMLXAML geladen, wenn die Seite geladen wird. ein dynamischer Ressourcen Verweis wird jedoch erst geladen, wenn 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

Das Suchverhalten des Ressourcen Suchvorgangs für einen dynamischen Ressourcen Verweis ist mit dem Suchverhalten in Ihrem Code FindResource vergleichbar SetResourceReference, wenn Sie oder aufruft.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. Anwendungs Ressourcen sind Ressourcen innerhalb des Ressourcen Wörterbuchs, das durch das Application -Objekt WPFWPF für die Anwendung definiert wird.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 von einem FindResource -Befehl angefordert wurde 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 von einem TryFindResource -Befehl angefordert wurde und nicht gefunden wurde, wird keine Ausnahme ausgelöst, aber der zurückgegebene Wert ist. nullIf 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 nicht akzeptiert null, ist es immer noch möglich, dass eine tiefere Ausnahme ausgelöst wird (Dies hängt davon ab, welche einzelne 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 Ressourcen Verweis in XAMLXAMLangefordert wurde und nicht gefunden wurde, hängt das Verhalten vom allgemeinen Eigenschaften System ab. das allgemeine Verhalten ist jedoch so, als ob kein Eigenschafts Einstellungs Vorgang auf der Ebene aufgetreten ist, auf der 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.

RestrictionsRestrictions

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 festgelegte Eigenschaft eine DependencyProperty -Eigenschaft oder Freezable -Eigenschaft sein muss, können die meisten Eigenschafts Änderungen an die Benutzeroberfläche weitergegeben werden, da eine Eigenschafts Änderung (der geänderte dynamische Ressourcen Wert) vom-Eigenschaften System 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 eine Logik, die ein anderes Layout eines Steuer DependencyProperty Elements erzwingt, wenn eine geändert wird und diese Eigenschaft das 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 bieten nicht alle Eigenschaften, die über eine dynamikresource-Markup Erweiterung als Wert verfügen, sicher, dass der Wert auf eine Weise bereitgestellt wird, in der Sie in Echtzeit auf der Benutzeroberfläche aktualisiert werden.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

Früher wurde angegeben, dass alle Elemente in einem ResourceDictionary über einen Schlüssel verfügen müssen.Earlier, it was stated that all items in a ResourceDictionary must have a key. Dies bedeutet jedoch nicht, dass alle Ressourcen über eine explizite x:Keyverfügen müssen.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 x:Key ein Attribut ein expliziter Schlüssel ist.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 sehr wichtiges Szenario für Ressourcen ist, wenn Sie einen Styledefinieren.One very important scenario for resources is when you define a Style. Tatsächlich ist eine Style fast immer als Eintrag in einem Ressourcen Wörterbuch definiert, da Stile grundsätzlich für die Wiederverwendung bestimmt 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 undVorlagen.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. Der implizite Schlüssel aus der Sicht der Anforderung ist der Type des Steuer Elements selbst.The implicit key from the standpoint of requesting it is the Type of the control itself. Der implizite Schlüssel aus der Sicht der Definition der Ressource ist der TargetType des Stils.The implicit key from the standpoint of defining the resource is the TargetType of the style. Wenn Sie Designs für benutzerdefinierte Steuerelemente erstellen und Stile erstellen, die mit vorhandenen Designstilen interagieren, müssen Sie daher keine x:Key-Direktive Styleangeben.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. Beispielsweise funktioniert die folgende Format Definition, obwohl die Style Ressource anscheinend keinen Schlüssel hat: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 hat tatsächlich einen Schlüssel: den impliziten Schlüssel typeof(. Button )That style really does have a key: the implicit key typeof(Button). In Markup können Sie einen TargetType direkt als Typnamen angeben (oder Sie können optional {x:Type...} verwenden.In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} , um einen Typezurückzugeben.to return a Type.

Mithilfe der von WPFWPFverwendeten Standardverfahren für Designstile wird dieser Stil als Lauf Zeit Stil Button eines auf der Seite angewendet, auch wenn der Button selbst nicht versucht, seine Style Eigenschaft oder eine bestimmte Ressource anzugeben. Verweis auf den Stil.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. Ihr Stil, der auf der Seite definiert ist, wurde bereits in der Such Sequenz als der Design wörtertyp gefunden. dabei wird derselbe Schlüssel verwendet, den der Stil des Design Wörterbuchs besitzt.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önnen einfach an <Button>Hello</Button> einer Button beliebigen Stelle auf der Seite angeben, und der Stil TargetType , den Sie mit definiert haben, gilt für diese Schaltfläche.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 den Stil weiterhin explizit mit dem gleichen Typwert wie TargetType, aus Gründen der Übersichtlichkeit in Ihrem Markup, aber optional.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, OverridesDefaultStyle Wenn true ist (Beachten Sie OverridesDefaultStyle auch, dass möglicherweise als Teil des nativen Verhaltens für die Steuerelement Klasse und nicht explizit für eine Instanz des Steuer Elements festgelegt wird).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). Um implizite Schlüssel für abgeleitete Klassen Szenarios zu unterstützen, muss das Steuerelement DefaultStyleKey auch überschreiben (alle vorhandenen Steuerelemente WPFWPF , die im Rahmen dieses Szenarios bereitgestellt werden).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 Steuerelementen finden Sie unter Richtlinien zum Entwerfen von Formatierbaren Steuerelementen.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplateverfügt auch über einen impliziten Schlüssel.DataTemplate also has an implicit key. Der implizite Schlüssel für einen DataTemplate ist der DataType Eigenschafts Wert.The implicit key for a DataTemplate is the DataType property value. DataTypekann auch als Name des Typs angegeben werden, anstatt explizit {x:Type...}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