Ресурсы XAMLXAML Resources

Ресурс — это объект, который можно повторно использовать в разных местах приложения.A resource is an object that can be reused in different places in your application. Примерами ресурсов являются кисти и стили.Examples of resources include brushes and styles. В этом обзоре описывается использование ресурсов в XAMLXAML.This overview describes how to use resources in XAMLXAML. Можно также создать и доступ к ресурсам с помощью кода или попеременно между кодом и Язык XAMLExtensible Application Markup Language (XAML).You can also create and access resources by using code, or interchangeably between code and Язык XAMLExtensible Application Markup Language (XAML). Дополнительные сведения см. в разделе ресурсы и код.For more information, see Resources and Code.

Примечание

Файлы ресурсов, описанных в этом разделе, отличаются от файлов ресурсов, описанных в ресурса приложения WPF, содержимое и файлы данных и отличаются от внедренных или связанных ресурсов, описанных в управление Ресурсами приложения (.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).

Использование ресурсов в XAMLUsing Resources in XAML

В следующем примере определяется SolidColorBrush как ресурс в корневом элементе страницы.The following example defines a SolidColorBrush as a resource on the root element of a page. Затем ссылается на ресурс и использует его для задания свойства нескольких дочерних элементов, включая Ellipse, TextBlockи 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>


Каждый элемент уровня платформы (FrameworkElement или FrameworkContentElement) имеет Resources свойство, которое является свойством, содержит ресурсы (как ResourceDictionary), определяющий ресурс.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. Вы можете определить ресурсы в любом элементе.You can define resources on any element. Тем не менее, ресурсы, наиболее часто определяются в корневом элементе, который является Page в примере.However, resources are most often defined on the root element, which is Page in the example.

Каждый ресурс в словаре ресурсов должен иметь уникальный ключ.Each resource in a resource dictionary must have a unique key. При определении ресурсов в разметке, можно назначить уникальный ключ через директивы x: Key.When you define resources in markup, you assign the unique key through the x:Key Directive. Как правило, ключ является строкой. Однако можно задать его как другой тип объекта с помощью соответствующих расширений разметки.Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. Нестроковые ключи для ресурсов используются в определенных функциональных областях в WPFWPF, в частности в стили, ресурсах компонентов и стилях данных.Nonstring keys for resources are used by certain feature areas in WPFWPF, notably for styles, component resources, and data styling.

После определения ресурса можно ссылаться на ресурс, который должен быть использован для значения свойства, с помощью синтаксиса расширения разметки ресурсов, задающего имя ключа, например: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}"/>

В предыдущем примере когда XAMLXAML загрузчика обрабатывает значение {StaticResource MyBrush} для Background свойство Button, логика подстановки ресурсов сначала проверяет словарь ресурсов для Button элемент.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. Если Button нет определения ключа ресурса MyBrush (это не так, его коллекция ресурсов пуста), затем подстановка проверяет родительский элемент Button, который является 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. Таким образом, при определении ресурса на Page корневой элемент, все элементы в логическом дереве Page можно получить доступ, и можно повторно использовать тот же ресурс для задания значения любого свойства, принимает Type , ресурс представляет.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. В предыдущем примере, же MyBrush ресурсов задает два различных свойства: Background из Buttonи Fill из Rectangle.In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

Статические и динамические ресурсыStatic and Dynamic Resources

Ресурс может использоваться как статический или динамический ресурс.A resource can be referenced as either a static resource or a dynamic resource. Это делается с помощью расширение разметки StaticResource или расширение разметки DynamicResource.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Расширения разметки — это функция XAMLXAML переполняться можно указать ссылку на объект с расширением разметки обработки строки атрибута и возврата объекта XAMLXAML загрузчика.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. Дополнительные сведения о поведении расширения разметки, см. в разделе расширения разметки и XAML WPF.For more information about markup extension behavior, see Markup Extensions and WPF XAML.

При использовании расширения разметки обычно предоставляют один или несколько параметров в виде строки; они обрабатываются этим расширением разметки, а не в контексте задаваемого свойства.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. Расширение разметки StaticResource обрабатывает ключ путем поиска значения для этого ключа во всех доступных словарях ресурсов.The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. Это происходит во время загрузки, которая является моментом времени, когда процессу загрузки необходимо присвоить значение свойству, которое принимает ссылку на статический ресурс.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. Расширение разметки DynamicResource вместо процессы ключ путем создания выражения и это выражение остается необработанным пока приложение фактически выполняется, после чего выражение вычисляется и получается значение.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.

Приведенные ниже соображения могут повлиять на выбор использования ссылки на статический или динамический ресурс.When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • Общая схема создания ресурсов для приложения (постранично, в приложении, в свободном XAMLXAML, в сборке только ресурсов).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).

  • Является ли обновление ресурсов в режиме реального времени частью требований приложения.The application functionality: is updating resources in real time part of your application requirements?

  • Соответствующее поведение подстановки этого ссылочного типа ресурса.The respective lookup behavior of that resource reference type.

  • Конкретное свойство или тип ресурса и собственное поведение этих типов.The particular property or resource type, and the native behavior of those types.

Статические ресурсыStatic Resources

Ссылки на статические ресурсы лучше всего использовать в указанных ниже случаях.Static resource references work best for the following circumstances:

  • Когда структура приложения концентрирует большую часть его ресурсов в словарях ресурсов уровня страницы или приложения.Your application design concentrates most of all of its resources into page or application level resource dictionaries. Ссылки на статические ресурсы не обрабатываются повторно в зависимости от поведения во время выполнения, например при перезагрузке страницы. Таким образом, можно получить выигрыш в производительности благодаря отсутствию большого количества динамических ссылок на ресурсы, когда согласно структуре ресурсов и приложения в них нет необходимости.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.

  • Вы задаете значение свойства, не принадлежащем DependencyObject или Freezable.You are setting the value of a property that is not on a DependencyObject or a Freezable.

  • При создании словаря ресурсов, который будет скомпилирован в DLL и либо упакован как часть приложения, либо совместно использоваться приложениями.You are creating a resource dictionary that will be compiled into a DLL, and packaged as part of the application or shared between applications.

  • При создании темы для пользовательского элемента управления и определении ресурсов, используемых в темах.You are creating a theme for a custom control, and are defining resources that are used within the themes. В этом случае обычно не требуется подстановка ссылок на динамические ресурсы. Вместо этого требуется подстановка ссылок на статические ресурсы, чтобы подстановка была прогнозируемой и самодостаточной для темы.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. При использовании ссылки на динамический ресурс даже ссылка в теме остается необработанной до времени выполнения и есть вероятность того, что при применении темы некоторые локальные элементы переопределят ключ, на который тема пытается сослаться, и локальный элемент окажется перед темой при подстановке.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. Если такое случится, тема будет работать не так, как ожидалось.If that happens, your theme will not behave in an expected manner.

  • При использовании ресурсов для задания большого количества свойств зависимостей.You are using resources to set large numbers of dependency properties. Свойства зависимостей обладают эффективным кэшированием значений, обеспечиваемым системой свойств, поэтому, если предоставить свойству зависимости значение, которое может быть вычислено во время загрузки, свойству не потребуется проверять пересчитанное выражение и оно сможет вернуть последнее фактическое значение.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. Этот метод может обеспечить выигрыш в производительности.This technique can be a performance benefit.

  • Вы хотите изменить основной ресурс для всех объектов-получателей, или вы хотите поддерживать отдельные записываемые экземпляры для каждого объекта-получателя с помощью x: Shared Attribute.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.

Поведение подстановки статического ресурсаStatic resource lookup behavior

  1. Процесс подстановки ищет запрошенный ключ в словаре ресурсов, определенном элементом, который устанавливает это свойство.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Затем процесс подстановки обходит логическое дерево снизу вверх до родительского элемента и его словаря ресурсов.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Это продолжается до тех пор, пока не будет достигнут корневой элемент.This continues until the root element is reached.

  3. Далее проверяются ресурсы приложения.Next, application resources are checked. Ресурсы приложения — это ресурсы в словаре ресурсов, который определяется Application объекта для вашей WPFWPF приложения.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

Ссылки на статический ресурс из словаря ресурсов должны указывать на ресурс, уже определенный лексически до ссылки на ресурс.Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. Опережающие ссылки не могут быть разрешены ссылкой на статический ресурс.Forward references cannot be resolved by a static resource reference. По этой причине, если используются ссылки на статический ресурс, нужно так разрабатывать структуру словаря ресурсов, чтобы ресурсы, предназначенные для использования ресурсами, определялись в начале каждого соответствующего словаря ресурсов или около него.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.

Подстановку статических ресурсов можно расширить в темы или в системные ресурсы, но это поддерживается только в том случае, поскольку XAMLXAML загрузчик задерживает запрос.Static resource lookup can extend into themes, or into system resources, but this is supported only because the XAMLXAML loader defers the request. Задержка необходима, чтобы тема среды выполнения в момент загрузки страницы правильно применялась к приложению.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the application. Однако не рекомендуется использование ссылок на статические ресурсы для ключей, которые существуют только в теме или как системные ресурсы.However, static resource references to keys that are known to only exist in themes or as system resources are not recommended. Это происходит потому, что такие ссылки не будут повторно обработаны при изменении темы пользователем в режиме реального времени.This is because such references are not reevaluated if the theme is changed by the user in realtime. Ссылки на динамические ресурсы более надежны при запросе темы или системных ресурсов.A dynamic resource reference is more reliable when you request theme or system resources. Исключением является случай, когда элемент темы сам запрашивает другой ресурс.The exception is when a theme element itself requests another resource. Такие ссылки должны быть статическими по причинам, упомянутым выше.These references should be static resource references, for the reasons mentioned earlier.

Поведение исключения, если ссылка на статический ресурс не найдена, варьируется.The exception behavior if a static resource reference is not found varies. Если ресурс был задержан, то исключение возникнет во время выполнения.If the resource was deferred, then the exception occurs at runtime. Если ресурс не был задержан, исключение возникнет во время загрузки.If the resource was not deferred, the exception occurs at load time.

Динамические ресурсыDynamic Resources

Динамические ресурсы лучше всего подходят для указанных ниже случаев.Dynamic resources work best for the following circumstances:

  • Когда значение ресурса зависит от условий, не известных до времени выполнения.The value of the resource depends on conditions that are not known until runtime. Сюда входят системные ресурсы или ресурсы, которые в противном случае задаются пользователем.This includes system resources, or resources that are otherwise user settable. Например, можно создать значения установщика, которые ссылаются на системные свойства, как представлено SystemColors, SystemFonts, или SystemParameters.For example, you can create setter values that refer to system properties, as exposed by SystemColors, SystemFonts, or SystemParameters. Эти значения являются действительно динамическими, так как они в конечном счете берутся из среды выполнения пользователя и операционной системы.These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. Кроме того, возможны темы уровня приложения, которые могут изменяться, когда при доступе к ресурсу уровня страницы также необходимо отследить изменения.You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • При создании стилей темы или ссылке на них для пользовательского элемента управления.You are creating or referencing theme styles for a custom control.

  • Когда планируется настроить содержимое ResourceDictionary во время существования приложения.You intend to adjust the contents of a ResourceDictionary during an application lifetime.

  • Когда имеется сложная структура ресурсов с взаимозависимостями, где могут потребоваться опережающие ссылки.You have a complicated resource structure that has interdependencies, where a forward reference may be required. Ссылки на статические ресурсы не поддерживают опережающие ссылки, но ссылки на динамические ресурсы поддерживают их, так как ресурс не нужно пересчитывать до времени выполнения, и опережающие ссылки, следовательно, не релевантны.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.

  • При ссылке на особенно большой с точки зрения компиляции или рабочего множества ресурс, если он может не использоваться немедленно при загрузке страницы.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. Ссылки на статические ресурсы всегда загружаются из XAMLXAML при загрузке страницы; однако ссылка на динамический ресурс не загружается до фактического использования.Static resource references always load from XAMLXAML when the page loads; however, a dynamic resource reference does not load until it is actually used.

  • При создании стиля, где значения для метода задания могут браться из других значений, на которые влияют темы или другие пользовательские параметры.You are creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • Когда ресурсы применяются к элементам, для которых во время существования приложения может быть изменен порядок наследования в логическом дереве.You are applying resources to elements that might be reparented in the logical tree during application lifetime. Изменение родительского элемента также потенциально изменяет область подстановки ресурса, так что, если необходим пересчет ресурса в новой области элемента с измененным порядком наследования, всегда следует использовать ссылку на динамический ресурс.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.

Поведение подстановки динамического ресурсаDynamic resource lookup behavior

Поведение подстановки ресурса для ссылки на динамический ресурс аналогично поведению подстановки в коде при вызове метода FindResource или SetResourceReference.Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference.

  1. Процесс подстановки ищет запрошенный ключ в словаре ресурсов, определенном элементом, который устанавливает это свойство.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Затем процесс подстановки обходит логическое дерево снизу вверх до родительского элемента и его словаря ресурсов.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Это продолжается до тех пор, пока не будет достигнут корневой элемент.This continues until the root element is reached.

  3. Далее проверяются ресурсы приложения.Next, application resources are checked. Ресурсы приложения — это ресурсы в словаре ресурсов, который определяется Application объекта для вашей WPFWPF приложения.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

  4. Для текущей активной темы проверяется словарь ресурсов темы.Theme resource dictionary is checked, for the currently active theme. Если тема изменяется во время выполнения, значение будет повторно вычислено.If the theme changes at runtime, the value is reevaluated.

  5. Проверяются системные ресурсы.System resources are checked.

Поведение исключения (если таковое имеется) варьируется.Exception behavior (if any) varies:

  • Если ресурс был запрошен пользователем FindResource вызова и не найден, возникает исключение.If a resource was requested by a FindResource call, and was not found, an exception is raised.

  • Если ресурс был запрошен пользователем TryFindResource вызова и не найден, исключение не создается, но возвращаемое значение — null.If a resource was requested by a TryFindResource call, and was not found, no exception is raised, but the returned value is null. Если задаваемое свойство не принимает null, по-прежнему возможно, что глубже исключение (это зависит от задания отдельного свойства).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).

  • Если ресурс запрошен по ссылке на динамический ресурс в XAMLXAMLи не найден, то поведение зависит от общей системы свойств, но общее поведение таково, как если бы не свойство произошло операции задания на уровне, где существует ресурс.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. Например, при попытке задать фон для отдельного элемента кнопки с помощью ресурса, который не может быть вычислен, не происходит задания значения, но фактическое значение по-прежнему может быть получено от других членов системы свойств и приоритета значения.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. Например, значение фона может по-прежнему браться из локально определенного стиля кнопки или из стиля темы.For instance, the background value might still come from a locally defined button style, or from the theme style. Для свойств, не определенных стилями темы, после неудавшейся попытки обработки ресурса фактическое значение может браться из значения по умолчанию в метаданных свойства.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.

ОграниченияRestrictions

Для ссылок на динамические ресурсы есть некоторые важные ограничения.Dynamic resource references have some notable restrictions. Должно выполняться по крайней мере одно из указанных ниже условий.At least one of the following must be true:

Так как задаваемое свойство должно быть DependencyProperty или Freezable свойство, большинство изменений свойств может распространяться на пользовательский Интерфейс, так как изменение свойства (измененное значение динамического ресурса) подтверждается системой свойств.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. Большинство элементов управления включает логику, которая принудительно создаст новый макет элемента управления, если DependencyProperty изменения и что свойство может повлиять на макет.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Однако не все свойства, имеющие расширение разметки DynamicResource качестве их значения, гарантированно предоставляют значение таким образом, что они обновляются в реальном времени в пользовательском Интерфейсе.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. Функциональные возможности по-прежнему могут отличаться в зависимости от свойства, типа, которому принадлежит свойство, или даже логической структуры приложения.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.

Стили, DataTemplates и неявные ключиStyles, DataTemplates, and Implicit Keys

Ранее было отмечено, что все товары в ResourceDictionary потребуется ключ.Earlier, it was stated that all items in a ResourceDictionary must have a key. Тем не менее, это означает, что все ресурсы должны иметь явный x:Key.However, that does not mean that all resources must have an explicit x:Key. Некоторые типы объектов поддерживают неявный ключ, если он определен как ресурс, где значение ключа связано со значением другого свойства.Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. Это называется неявным ключом, тогда как x:Key атрибута является явным ключом.This is known as an implicit key, whereas an x:Key attribute is an explicit key. Любой неявный ключ можно перезаписать, указав явный ключ.You can overwrite any implicit key by specifying an explicit key.

Одним очень важным сценарием для ресурсов является определение Style.One very important scenario for resources is when you define a Style. На самом деле Style почти всегда определяется как запись в словаре ресурсов, так как стили наследственным образом предназначены для повторного использования.In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. Дополнительные сведения о стилях см. в разделе Стилизация и использование шаблонов.For more information about styles, see Styling and Templating.

С помощью неявного ключа можно создавать стили для элементов управления либо ссылаться на них.Styles for controls can be both created with and referenced with an implicit key. Стили темы, определяющие внешний вид элемента управления по умолчанию, используют этот неявный ключ.The theme styles that define the default appearance of a control rely on this implicit key. Неявный ключ с точки зрения запроса представляет Type самого элемента управления.The implicit key from the standpoint of requesting it is the Type of the control itself. Неявный ключ с точки зрения определения ресурса представляет TargetType стиля.The implicit key from the standpoint of defining the resource is the TargetType of the style. Таким образом, если вы создаете темы для пользовательских элементов управления, стили, которые взаимодействуют с существующими стилями темы, необходимо указать директивы x: Key для этого 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. А если требуется использовать стили из тем, то вообще не нужно задавать стиль.And if you want to use the themed styles, you do not need to specify any style at all. Например, следующее определение стиля работает, даже если Style ресурсов не имеет ключа: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>

Что стиля на самом деле есть ключ: неявный ключ typeof( Button ).That style really does have a key: the implicit key typeof(Button). В разметке, можно указать TargetType непосредственно в качестве типа имени (или при необходимости можно использовать {x: Type...}In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} для возврата Type.to return a Type.

Через механизмах стилей темы по умолчанию, используемые WPFWPF, что стиль будет применен как стиль среды выполнения для Button на странице, несмотря на то что Button сам пытается задать его Style свойство или конкретного ресурса ссылка на стиль.Through the default theme style mechanisms used by WPFWPF, that style is applied as the runtime style of a Button on the page, even though the Button itself does not attempt to specify its Style property or a specific resource reference to the style. Стиль, определенный на странице, находится в последовательности подстановки, чем стиль словаря темы, используя тот же ключ, который имеет стиль словаря темы.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. Вы можете просто указать <Button>Hello</Button> в любом месте страницы и стиль, определенный с помощью TargetType из Button будет применен к этой кнопке.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. Если требуется, можно по-прежнему явно ключ стиля с тем же значением типа, как TargetTypeдля ясности в разметке, но это не является обязательным.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.

Неявные ключи для стилей не применяются к элементу управления, если OverridesDefaultStyletrue (также Обратите внимание, что OverridesDefaultStyle может быть задан как часть собственного поведения для класса элемента управления, а не явным образом в экземпляре элемента управления).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). Кроме того, чтобы поддерживать неявные ключи для производных классов, элемент управления необходимо переопределить DefaultStyleKey (все существующие элементы управления, предоставляемые как часть WPFWPF этого).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). Дополнительные сведения о стилях, темах и разработке элементов управления см. в разделе рекомендации по разработке элементов.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplate также имеет неявный ключ.DataTemplate also has an implicit key. Неявным ключом для DataTemplate является DataType значение свойства.The implicit key for a DataTemplate is the DataType property value. DataType также можно указать как имя типа, а не явным образом с помощью {x: Type...} .DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. Дополнительные сведения см. в разделе Общие сведения о шаблонах данных.For details, see Data Templating Overview.

См. такжеSee also