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. Esta introducción describe cómo usar los recursos de XAMLXAML.This overview describes how to use resources in XAMLXAML. También puede crear y tener acceso a recursos mediante código o indistintamente 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, consulte recursos y código.For more information, see Resources and Code.

Nota

Los archivos de recursos que se describe en este tema son diferentes de los archivos de recursos se describen en WPF Application Resource, contenido y los archivos de datos y diferentes de los recursos incrustados o vinculados que se describe en administrar Recursos de la 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 define un SolidColorBrush 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. En el ejemplo, a continuación, hace referencia al recurso y lo usa para establecer las propiedades de varios elementos secundarios, incluida una Ellipse, un TextBlocky un 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 marco (FrameworkElement o FrameworkContentElement) tiene un Resources propiedad, que es la propiedad que contiene los recursos (como un ResourceDictionary) que define un recurso.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 más frecuencia en el elemento raíz, que es Page 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 los recursos en el marcado, 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 cadenas de recursos se usan por ciertas áreas de características de WPFWPF, en particular para los estilos, los recursos del componente y los estilos de 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} para el Background propiedad Button, la lógica de búsqueda de recursos comprueba en primer lugar el diccionario de recursos para el Button 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 de recurso MyBrush (no la tiene; su colección de recursos está vacía), a continuación, la búsqueda comprueba el elemento primario del Button, que es 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. Por lo tanto, al definir un recurso en el Page elemento raíz, todos los elementos en el árbol lógico de la Page puede tener acceso a él y puede reutilizar el mismo recurso para establecer el valor de cualquier propiedad que acepta el Type 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 dos propiedades diferentes conjuntos de recursos: la Background de un Buttony el Fill de un Rectangle.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 el uso del StaticResource Markup Extension o DynamicResource Markup Extension.This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Una extensión de marcado es una característica de XAMLXAML según la cual puede especificar una referencia de objeto al tener la extensión de marcado de procesar la cadena de atributo y devolver el objeto a un XAMLXAML 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, consulte extensiones de marcado y WPF XAML.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. El StaticResource Markup Extension procesa una clave buscando el valor para 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. El DynamicResource Markup Extension en su lugar los procesos de una clave mediante la creación de una expresión y dicha expresión permanece sin evaluar hasta que realmente se ejecuta la aplicación, 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, sueltos en XAMLXAML, en un ensamblado solo de 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.

  • Se establece el valor de una propiedad que no se encuentra en un DependencyObject o Freezable.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.

  • Para cambiar el recurso subyacente para todos los consumidores o quiere mantener instancias grabables independientes para cada consumidor mediante el uso de la 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.

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. Recursos de la aplicación son aquellos recursos dentro del diccionario de recursos definido por el Application objeto para su WPFWPF 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.

Puede ampliar la búsqueda de recursos estáticos a los temas, o a los recursos del sistema, pero esto solo se admite porque el XAMLXAML aplaza el cargador de 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 hacen referencia a propiedades del sistema, tal como se expone por SystemColors, SystemFonts, o SystemParameters.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.

  • Pretende ajustar el contenido de un ResourceDictionary durante un período de 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. Referencias de recursos estáticos no admiten las referencias adelantadas, pero las referencias de recursos dinámicos sí lo admiten porque no es necesario que el recurso se puede evaluar hasta el tiempo de ejecución y las referencias adelantadas, por tanto, 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. Referencias de recursos estáticos siempre se cargan desde XAMLXAML cuando se cargue la página; sin embargo, una referencia de recurso dinámico no se carga hasta que se usa realmente.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

Comportamiento de búsqueda de recursos de una referencia de recurso dinámico es similar al comportamiento de búsqueda en el código si llama a FindResource o SetResourceReference.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. Recursos de la aplicación son aquellos recursos dentro del diccionario de recursos definido por el Application objeto para su WPFWPF 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 se ha solicitado un recurso mediante un FindResource llamar 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 se ha solicitado un recurso mediante un TryFindResource llamar y no se encontró, no se genera 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 va a establecer no acepta null, a continuación, sigue siendo posible que se producirá una excepción más profunda (Esto depende de la propiedad individual que se va a establecer).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 se ha solicitado un recurso mediante una referencia de recurso dinámico en XAMLXAMLy no se encontró, a continuación, el comportamiento depende del sistema de propiedades general, pero el comportamiento general es como si se ha producido ninguna operación de configuración de la propiedad en el nivel donde 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 ser un DependencyProperty o Freezable propiedad, pueden propagar la mayoría de los cambios de propiedad a la interfaz de usuario porque se confirma un cambio de propiedad (el valor de recurso dinámico modificado) por el sistema de propiedades.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. Mayoría de los controles incluye lógica que forzará otro diseño de un control si un DependencyProperty los cambios y que propiedad puede 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 todas las propiedades que tienen un DynamicResource Markup Extension como su valor se garantiza que proporcione el valor de tal manera que actualizan 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 ha mencionado que todos los elementos de un ResourceDictionary debe tener una clave.Earlier, it was stated that all items in a ResourceDictionary must have a key. Sin embargo, eso no significa que todos los recursos deben tener una explícita x:Key.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 un x:Key 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 consiste en definir un Style.One very important scenario for resources is when you define a Style. De hecho, un Style casi siempre se define como una entrada en un diccionario de recursos, porque los estilos están previstos para su reutilización.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, consulte 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 su solicitud es el Type 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 es el TargetType 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 existente, no necesitará especificar un Directiva x: Key para que 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 recursos no parecen 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>

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

Mediante los mecanismos de estilo de tema predeterminado utilizados por WPFWPF, ese estilo se aplica como el estilo en tiempo de ejecución de un Button en la página, incluso aunque el Button propio no intenta especificar su Style propiedad o un recurso específico hacer 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. Su estilo definido en la página se encuentra anteriormente en la secuencia de búsqueda que el estilo del diccionario de tema con la misma clave que tiene el estilo del diccionario de tema.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. Simplemente puede especificar <Button>Hello</Button> en cualquier parte de la página y el estilo definido 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, puede clave explícitamente el estilo con el mismo valor de tipo como TargetType, para mayor claridad en el marcado, pero que 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 un control si OverridesDefaultStyle es true (tenga en cuenta también que OverridesDefaultStyle puede establecerse como parte del comportamiento nativo para la clase de control, en lugar de forma explícita 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 los escenarios de la clase derivada, el control debe invalidar DefaultStyleKey (todos los controles existentes que se proporciona como parte de WPFWPF hacerlo).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 acerca de los estilos, temas y diseño de control, vea directrices para diseñar controles con estilos.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplate También tiene una clave implícita.DataTemplate also has an implicit key. La clave implícita de un DataTemplate es la DataType valor de propiedad.The implicit key for a DataTemplate is the DataType property value. DataType También se puede especificar como el nombre del tipo en lugar de forma explícita mediante {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, consulte Data Templating Overview.For details, see Data Templating Overview.

Vea tambiénSee also