Recursos XAMLXAML Resources

Un recurso es un objeto que se puede volver a usar en diferentes sitios de la aplicación.A resource is an object that can be reused in different places in your application. Pinceles y estilos son ejemplos de recursos.Examples of resources include brushes and styles. En esta información general se describe cómo usar XAMLXAMLlos recursos de.This overview describes how to use resources in XAMLXAML. También puede crear y obtener acceso a recursos mediante código, o bien de forma intercambiable entre código y Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML).You can also create and access resources by using code, or interchangeably between code and Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML). Para obtener más información, vea recursos y código.For more information, see Resources and Code.

Nota

Los archivos de recursos que se describen en este tema son diferentes de los archivos de recursos que se describen en archivos de recursos, contenido y datos de aplicaciones de WPF y distintos de los recursos incrustados o vinculados que se describen en administración de recursos de aplicación (.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).

Uso de recursos en XAMLUsing Resources in XAML

En el ejemplo siguiente se SolidColorBrush define como un recurso en el elemento raíz de una página.The following example defines a SolidColorBrush as a resource on the root element of a page. A continuación, el ejemplo hace referencia al recurso y lo usa para establecer las propiedades de varios elementos Ellipsesecundarios, TextBlockincluidos, y 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>


Cada elemento de nivel de marcoFrameworkElement ( FrameworkContentElemento) tiene Resources una propiedad, que es la propiedad que contiene los recursos (como ResourceDictionaryun) que un recurso define.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. Puede definir recursos en cualquier elemento.You can define resources on any element. Sin embargo, los recursos se definen con mayor frecuencia en el elemento raíz Page , que se encuentra en el ejemplo.However, resources are most often defined on the root element, which is Page in the example.

Cada recurso en un diccionario de recursos debe tener una clave única.Each resource in a resource dictionary must have a unique key. Al definir recursos en el marcado, se asigna la clave única a través de la Directiva x:Key.When you define resources in markup, you assign the unique key through the x:Key Directive. Normalmente, la clave es una cadena; pero puede también establecerla para otros tipos de objetos usando las extensiones de marcado apropiadas.Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. Las claves que no son de cadena para los recursos se utilizan WPFWPFen algunas áreas de características de, especialmente para los estilos, los recursos de componentes y el estilo de los datos.Nonstring keys for resources are used by certain feature areas in WPFWPF, notably for styles, component resources, and data styling.

Después de definir un recurso, puede hacer referencia a los recursos que se usarán para un valor de propiedad mediante una sintaxis de extensión de marcado de recursos que especifica el nombre de clave, por ejemplo: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}"/>

En el ejemplo anterior, cuando el XAMLXAML cargador procesa el valor {StaticResource MyBrush} de la Background propiedad en Button, la lógica de búsqueda de recursos comprueba primero el Diccionario de Button recursos para el elemento.In the preceding example, when the XAMLXAML loader processes the value {StaticResource MyBrush} for the Background property on Button, the resource lookup logic first checks the resource dictionary for the Button element. Si Button no tiene una definición de la clave MyBrush de recurso (no la tiene; su colección de recursos está vacía), la búsqueda siguiente comprueba el elemento primario Buttonde, que Pagees.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. Por lo tanto, al definir un recurso en Page el elemento raíz, todos los elementos del árbol lógico Page de pueden tener acceso a él y puede volver a usar el mismo recurso para establecer el valor de cualquier propiedad que acepte Type el que el recurso representa.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. En el ejemplo anterior, el mismo MyBrush recurso establece dos propiedades diferentes Background : Fill de Buttony Rectanglede.In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

Recursos estáticos y dinámicosStatic and Dynamic Resources

Puede hacer referencia a un recurso como un recurso estático o un recurso dinámico.A resource can be referenced as either a static resource or a dynamic resource. Esto se hace mediante la extensión de marcado StaticResource o la extensión de marcado DynamicResource.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Una extensión de marcado es una característica XAMLXAML de por la que se puede especificar una referencia de objeto al hacer que la extensión de marcado procese la cadena de XAMLXAML atributo y devuelva el objeto a un cargador.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. Para obtener más información sobre el comportamiento de la extensión de marcado, vea extensiones de marcado y XAML de WPF.For more information about markup extension behavior, see Markup Extensions and WPF XAML.

Cuando se usa una extensión de marcado, normalmente proporciona uno o varios parámetros en forma de cadena que son procesados por dicha extensión de marcado, en lugar de que se evalúe en el contexto de la propiedad que se va a establecer.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. La extensión de marcado StaticResource procesa una clave buscando el valor de esa clave en todos los diccionarios de recursos disponibles.The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. Esto sucede durante la carga, que es el punto en el tiempo cuando el proceso de carga necesita asignar el valor de propiedad que acepta la referencia de recurso estático.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. La extensión de marcado DynamicResource procesa en su lugar una clave mediante la creación de una expresión y esa expresión permanece sin evaluar hasta que la aplicación se ejecuta realmente, momento en el que se evalúa la expresión y proporciona un valor.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.

Al hacer referencia a un recurso, independientemente de si usa una referencia de recurso estático o una referencia de recurso dinámico, pueden influir las siguientes consideraciones:When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • El diseño general de cómo crear los recursos de la aplicación (por página, en la aplicación, de forma dinámica XAMLXAML, en un ensamblado de solo recursos).The overall design of how you create the resources for your application (per page, in the application, in loose XAMLXAML, in a resource only assembly).

  • La función de la aplicación: ¿la actualización de recursos en tiempo real forma parte de los requisitos de la aplicación?The application functionality: is updating resources in real time part of your application requirements?

  • El comportamiento de búsqueda respectivo de ese tipo de referencia de recurso.The respective lookup behavior of that resource reference type.

  • La propiedad o tipo de recurso determinado y el comportamiento nativo de esos tipos.The particular property or resource type, and the native behavior of those types.

Recursos estáticosStatic Resources

Las referencias de recursos estáticos trabajan mejor en las siguientes circunstancias:Static resource references work best for the following circumstances:

  • El diseño de la aplicación concentra la mayoría de todos sus recursos en la página o en los diccionarios de recursos en el nivel de aplicación.Your application design concentrates most of all of its resources into page or application level resource dictionaries. Las referencias de recursos estáticos no se vuelven a evaluar en función de comportamientos en tiempo de ejecución, como recargar una página y, por tanto, puede haber algunas ventajas de rendimiento para evitar grandes cantidades de referencias de recursos dinámicos cuando no son necesarios por su diseño de aplicaciones y recursos.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.

  • Está estableciendo el valor de una propiedad que no está en DependencyObject Freezableo.You are setting the value of a property that is not on a DependencyObject or a Freezable.

  • Está creando un diccionario de recursos que se compilará en un archivo DLL y que se empaqueta como parte de la aplicación o se comparte entre aplicaciones.You are creating a resource dictionary that will be compiled into a DLL, and packaged as part of the application or shared between applications.

  • Está creando un tema para un control personalizado y está definiendo recursos que se usan dentro de los temas.You are creating a theme for a custom control, and are defining resources that are used within the themes. En este caso, normalmente no quiere el comportamiento de búsqueda de referencia de recursos dinámicos, sino el comportamiento de referencia de recursos estáticos, de manera que la búsqueda sea predecible e independiente para el tema.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. Con una referencia de recursos dinámicos, incluso una referencia dentro de un tema se deja sin evaluar hasta el tiempo de ejecución y es probable que, cuando se aplica el tema, algún elemento local vuelva a definir una clave a la que el tema está intentando hacer referencia, y el elemento local se detectará antes que el propio tema en la búsqueda.With a dynamic resource reference, even a reference within a theme is left unevaluated until runtime, and there is a chance that when the theme is applied, some local element will redefine a key that your theme is trying to reference, and the local element will fall prior to the theme itself in the lookup. Si esto sucede, el tema no se comportará de la manera esperada.If that happens, your theme will not behave in an expected manner.

  • Está usando recursos para establecer grandes cantidades de propiedades de dependencia.You are using resources to set large numbers of dependency properties. Las propiedades de dependencia tienen un almacenamiento en caché de valores efectivos habilitado por el sistema de propiedades, así que si proporciona un valor para una propiedad de dependencia que pueda evaluarse en tiempo de carga, la propiedad de dependencia no tiene que comprobar una expresión que se ha vuelto a evaluar y puede devolver el último valor efectivo.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. Esta técnica puede suponer una ventaja de rendimiento.This technique can be a performance benefit.

  • Desea cambiar el recurso subyacente para todos los consumidores o desea mantener instancias de escritura independientes para cada consumidor mediante el atributo x:Shared.You want to change the underlying resource for all consumers, or you want to maintain separate writable instances for each consumer by using the x:Shared Attribute.

Comportamiento de búsqueda de recursos estáticosStatic resource lookup behavior

  1. El proceso de búsqueda comprueba la clave solicitada en el diccionario de recursos que ha definido el elemento que establece la propiedad.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Después, el proceso de búsqueda recorre el árbol lógico hacia arriba, hasta el elemento primario y su diccionario de recursos.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Esto continúa hasta que se alcanza el elemento raíz.This continues until the root element is reached.

  3. Después, se comprueban los recursos de la aplicación.Next, application resources are checked. Los recursos de la aplicación son los recursos del Diccionario de recursos definidos por Application el objeto de WPFWPF la aplicación.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

Las referencias de recursos estáticos del interior de un diccionario de recursos deben hacer referencia a un recurso que ya se haya definido léxicamente antes que la referencia de recurso.Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. No se pueden resolver las referencias adelantadas mediante una referencia de recursos estáticos.Forward references cannot be resolved by a static resource reference. Por este motivo, si usa referencias de recursos estáticos, debe diseñar la estructura del diccionario de recursos de manera que los recursos previstos para su uso mediante recurso se definan en o cerca del principio de cada diccionario de recursos respectivo.For this reason, if you use static resource references, you must design your resource dictionary structure such that resources intended for by-resource use are defined at or near the beginning of each respective resource dictionary.

La búsqueda de recursos estáticos puede extenderse a los temas o a los recursos del sistema, pero XAMLXAML esto solo se admite porque el cargador pospone la solicitud.Static resource lookup can extend into themes, or into system resources, but this is supported only because the XAMLXAML loader defers the request. El aplazamiento es necesario, de manera que el tema en tiempo de ejecución en el momento de la carga de la página se aplique correctamente en la aplicación.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the application. En cambio, no se recomiendan las referencias de recursos estáticos a las claves que se sabe que solo existen en temas o como recursos del sistema.However, static resource references to keys that are known to only exist in themes or as system resources are not recommended. Esto se debe a que dichas referencias no se vuelven a evaluar si el usuario modifica el tema en tiempo real.This is because such references are not reevaluated if the theme is changed by the user in realtime. Una referencia de recurso dinámico es más confiable cuando solicita un tema o recursos del sistema.A dynamic resource reference is more reliable when you request theme or system resources. La excepción se produce cuando un elemento de tema solicita otro recurso.The exception is when a theme element itself requests another resource. Estas referencias deben ser referencias de recursos estáticos, por los motivos que se han mencionado anteriormente.These references should be static resource references, for the reasons mentioned earlier.

El comportamiento de excepción si no se detecta una referencia de recursos estáticos varía.The exception behavior if a static resource reference is not found varies. Si el recurso se ha aplazado, entonces la excepción se produce en tiempo de ejecución.If the resource was deferred, then the exception occurs at runtime. Si el recurso no se ha aplazado, la excepción se produce en tiempo de carga.If the resource was not deferred, the exception occurs at load time.

Recursos dinámicosDynamic Resources

Los recursos dinámicos trabajan mejor en las siguientes circunstancias:Dynamic resources work best for the following circumstances:

  • El valor del recurso depende de las condiciones que no se conocen hasta el tiempo de ejecución.The value of the resource depends on conditions that are not known until runtime. Esto incluye los recursos del sistema o recursos que, de otro modo, son configurables por el usuario.This includes system resources, or resources that are otherwise user settable. Por ejemplo, puede crear valores de establecedor que hagan referencia a las propiedades del sistema SystemColors, SystemFontstal como SystemParameterslas expone, o.For example, you can create setter values that refer to system properties, as exposed by SystemColors, SystemFonts, or SystemParameters. Estos valores son verdaderamente dinámicos porque proceden en definitiva del entorno en tiempo de ejecución del usuario y del sistema operativo.These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. También puede tener temas en el nivel de aplicación que pueden cambiar, donde el acceso a los recursos de nivel de página también debe capturar el cambio.You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • Está creando o haciendo referencia a estilos del tema para un control personalizado.You are creating or referencing theme styles for a custom control.

  • Tiene previsto ajustar el contenido de un ResourceDictionary durante la duración de la aplicación.You intend to adjust the contents of a ResourceDictionary during an application lifetime.

  • Tiene una estructura de recursos complicada que tiene interdependencias, donde puede necesitarse una referencia adelantada.You have a complicated resource structure that has interdependencies, where a forward reference may be required. Las referencias de recursos estáticos no admiten referencias adelantadas, pero las referencias de recursos dinámicos las admiten porque no es necesario evaluar el recurso hasta el tiempo de ejecución y, por lo tanto, las referencias adelantadas no son un concepto relevante.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.

  • Está haciendo referencia a un recursos que es especialmente grande desde la perspectiva de una compilación o espacio de trabajo, y el recurso puede no usarse inmediatamente cuando se carga la página.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. Las referencias de recursos estáticos XAMLXAML siempre se cargan desde que se carga la página; sin embargo, una referencia de recursos dinámicos no se carga hasta que realmente se usa.Static resource references always load from XAMLXAML when the page loads; however, a dynamic resource reference does not load until it is actually used.

  • Está creando un estilo donde los valores del establecedor pueden provenir de otros valores que están influenciados por temas u otra configuración del usuario.You are creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • Está aplicando recursos en elementos en los que se puede cambiar el elemento primario en el árbol lógico durante la vigencia de la aplicación.You are applying resources to elements that might be reparented in the logical tree during application lifetime. Cambiar el elemento primario también cambia potencialmente el ámbito de búsqueda de recursos, por lo que si quiere que el recurso de un elemento primario que se puede cambiar se vuelva a evaluar basándose en el nuevo ámbito, use siempre una referencia de recurso dinámico.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.

Comportamiento de búsqueda de recursos dinámicosDynamic resource lookup behavior

El comportamiento de búsqueda de recursos para una referencia de recursos dinámicos es paralelo al comportamiento de búsqueda FindResource en SetResourceReferenceel código si se llama a o.Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference.

  1. El proceso de búsqueda comprueba la clave solicitada en el diccionario de recursos que ha definido el elemento que establece la propiedad.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Después, el proceso de búsqueda recorre el árbol lógico hacia arriba, hasta el elemento primario y su diccionario de recursos.The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. Esto continúa hasta que se alcanza el elemento raíz.This continues until the root element is reached.

  3. Después, se comprueban los recursos de la aplicación.Next, application resources are checked. Los recursos de la aplicación son los recursos del Diccionario de recursos definidos por Application el objeto de WPFWPF la aplicación.Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

  4. Se comprueba el diccionario de recursos de temas para el tema activo actualmente.Theme resource dictionary is checked, for the currently active theme. Si el tema cambia en tiempo de ejecución, el valor se vuelve a evaluar.If the theme changes at runtime, the value is reevaluated.

  5. Se comprueban los recursos del sistema.System resources are checked.

El comportamiento de excepción (si existe) varía:Exception behavior (if any) varies:

  • Si una FindResource llamada solicitó un recurso y no se encontró, se produce una excepción.If a resource was requested by a FindResource call, and was not found, an exception is raised.

  • Si una TryFindResource llamada solicitó un recurso y no se encontró, no se produce ninguna excepción, pero el valor devuelto es null.If a resource was requested by a TryFindResource call, and was not found, no exception is raised, but the returned value is null. Si la propiedad que se está configurando no acepta null, sigue siendo posible que se genere una excepción más profunda (esto depende de la propiedad individual que se establece).If the property being set does not accept null, then it is still possible that a deeper exception will be raised (this depends on the individual property being set).

  • Si una referencia de recursos dinámicos solicitó un recurso XAMLXAMLen y no se encontró, el comportamiento depende del sistema de propiedades general, pero el comportamiento general es como si no se produjera ninguna operación de configuración de propiedad en el nivel en el que existe el recurso.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. Por ejemplo, si intenta establecer el fondo en un elemento de botón individual con un recurso que no puede evaluarse, entonces no se establece ningún valor, pero el valor efectivo todavía puede provenir de otros participantes del sistema de propiedades y la precedencia de valores.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. Por ejemplo, el valor de fondo todavía puede provenir de un estilo de botón definido localmente, o desde el estilo del tema.For instance, the background value might still come from a locally defined button style, or from the theme style. Para las propiedades que no se definen mediante los estilos del tema, el valor efectivo después de una evaluación de recursos incorrecta puede provenir del valor predeterminado de los metadatos de la propiedad.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.

RestriccionesRestrictions

Las referencias de recursos dinámicos tienen algunas restricciones importantes.Dynamic resource references have some notable restrictions. Debe cumplirse al menos una de las siguientes:At least one of the following must be true:

Dado que la propiedad que se establece debe DependencyProperty ser Freezable una propiedad o, la mayoría de los cambios de propiedad se pueden propagar a la interfaz de usuario porque el sistema de propiedades confirma un cambio de propiedad (el valor de recurso dinámico cambiado).Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to UI because a property change (the changed dynamic resource value) is acknowledged by the property system. La mayoría de los controles incluyen lógica que forzará otro diseño de un DependencyProperty control si un cambio y esa propiedad pueden afectar al diseño.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Sin embargo, no se garantiza que todas las propiedades que tienen una extensión de marcado DynamicResource como valor proporcionen el valor de tal forma que se actualicen en tiempo real en la interfaz de usuario.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. Esa función todavía puede variar dependiendo de la propiedad, así como dependiendo del tipo que posea la propiedad, o incluso de la estructura lógica de la aplicación.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.

Estilos, plantillas de datos y claves implícitasStyles, DataTemplates, and Implicit Keys

Anteriormente, se indicó que todos los elementos de un ResourceDictionary deben tener una clave.Earlier, it was stated that all items in a ResourceDictionary must have a key. Sin embargo, esto no significa que todos los recursos deben tener un x:Keyexplícito.However, that does not mean that all resources must have an explicit x:Key. Varios tipos de objetos admiten una clave implícita cuando se definen como un recurso, donde el valor de clave está vinculado al valor de otra propiedad.Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. Esto se conoce como una clave implícita, mientras que x:Key un atributo es una clave explícita.This is known as an implicit key, whereas an x:Key attribute is an explicit key. Puede sobrescribir cualquier clave implícita especificando una clave explícita.You can overwrite any implicit key by specifying an explicit key.

Un escenario muy importante para los recursos es cuando se define Styleun.One very important scenario for resources is when you define a Style. De hecho, un Style se define casi siempre como una entrada en un diccionario de recursos, porque los estilos están pensados de forma inherente para reutilizarlos.In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. Para obtener más información sobre los estilos, vea aplicar estilos y plantillas.For more information about styles, see Styling and Templating.

Los estilos para los controles pueden crearse y hacerse referencia con una clave implícita.Styles for controls can be both created with and referenced with an implicit key. Los estilos de tema que definen la apariencia predeterminada de un control se basan en esta clave implícita.The theme styles that define the default appearance of a control rely on this implicit key. La clave implícita desde el punto de vista de solicitarlo es Type el del propio control.The implicit key from the standpoint of requesting it is the Type of the control itself. La clave implícita desde el punto de vista de definir el recurso TargetType es el del estilo.The implicit key from the standpoint of defining the resource is the TargetType of the style. Por lo tanto, si está creando temas para controles personalizados, creando estilos que interactúen con los estilos de tema existentes, no es necesario especificar una Directiva x:Key para eso 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. Y si quiere usar los estilos temáticos, no necesita especificar ningún estilo.And if you want to use the themed styles, you do not need to specify any style at all. Por ejemplo, la siguiente definición de estilo funciona, aunque el Style recurso no parezca tener una clave: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>

Ese estilo realmente tiene una clave: la clave typeof( Button )implícita.That style really does have a key: the implicit key typeof(Button). En el marcado, puede especificar TargetType directamente como el nombre de tipo (o puede usar opcionalmente {x:Type...}In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} para devolver un Typevalor.to return a Type.

A través de los mecanismos de estilo de WPFWPFtema predeterminados que usa, ese estilo se aplica Button como estilo en tiempo de ejecución de Button un en la página, aunque el Style propio no intenta especificar su propiedad o un recurso específico. referencia al estilo.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. El estilo definido en la página se encuentra anteriormente en la secuencia de búsqueda que el estilo del Diccionario de temas, con la misma clave que el estilo del Diccionario de temas.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. Podría especificar <Button>Hello</Button> solo cualquier lugar de la página y el estilo que definió con TargetType de Button se aplicaría a ese botón.You could just specify <Button>Hello</Button> anywhere in the page, and the style you defined with TargetType of Button would apply to that button. Si lo desea, todavía puede especificar explícitamente el estilo con el mismo valor de tipo TargetTypeque, para mayor claridad en el marcado, pero esto es opcional.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.

Las claves implícitas para los estilos no se aplican en OverridesDefaultStyle un true control si es ( OverridesDefaultStyle también tenga en cuenta que se puede establecer como parte del comportamiento nativo de la clase de control, en lugar de explícitamente en una instancia del control).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). Además, para admitir claves implícitas para escenarios de clase derivada, el control debe invalidar DefaultStyleKey (todos los controles existentes que se proporcionan WPFWPF como parte de esto).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). Para obtener más información sobre los estilos, los temas y el diseño de controles, vea instrucciones para el diseño de controles con estilo.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplatetambién tiene una clave implícita.DataTemplate also has an implicit key. La clave implícita de un DataTemplate es el DataType valor de propiedad.The implicit key for a DataTemplate is the DataType property value. DataTypetambién se puede especificar como el nombre del tipo en lugar de usar explícitamente {x:Type...}.DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. Para obtener más información, vea información general sobre plantillas de datos.For details, see Data Templating Overview.

Vea tambiénSee also