Recursos XAML

 

Publicado: junio de 2016

Un recurso es un objeto que se puede reutilizar en diferentes lugares de la aplicación. Pinceles y estilos son ejemplos de recursos. Esta introducción describe cómo utilizar los recursos en XAML. También puede crear y tener acceso a recursos mediante código o indistintamente entre código y Lenguaje XAML (Extensible Application Markup Language). Para obtener más información, consulte recursos y código.

System_CAPS_ICON_note.jpg Nota

Los archivos de recursos que se describen en este tema son diferentes de los archivos de recursos se describen en archivos de datos, el contenido y el recurso de aplicación de WPF y diferente de los recursos incrustados o vinculados se describe en administración de recursos (. NET).

Entity with relative path '../Token/autoOutline_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'.

En el ejemplo siguiente se define un SolidColorBrush como un recurso en el elemento raíz de una página. En el ejemplo, a continuación, hace referencia al recurso y lo usa para establecer las propiedades de varios elementos secundarios, incluidos una elipse, TextBlocky un botón.

<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 recursos propiedad, que es la propiedad que contiene los recursos (como un ResourceDictionary) que define un recurso. Puede definir recursos en cualquier elemento. Sin embargo, los recursos normalmente se definen en el elemento raíz, que es página en el ejemplo.

Cada recurso en un diccionario de recursos debe tener una clave única. Al definir los recursos en el marcado, le asigna la clave única a través de la x: Key (directiva). Normalmente, la clave es una cadena; Sin embargo, puede también establecer para otros tipos de objetos utilizando las extensiones de marcado apropiado. Las claves que no son cadenas de recursos utiliza ciertas áreas de características de Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'., en particular para los estilos, recursos de componente y estilos de datos.

Después de definir un recurso, puede hacer referencia a los recursos que se usará para un valor de propiedad mediante una sintaxis de extensión de marcado de recursos que especifica el nombre de clave, por ejemplo:

        <Button Background="{StaticResource MyBrush}"/>
        <Ellipse Fill="{StaticResource MyBrush}"/>

En el ejemplo anterior, cuando el XAML cargador procesa el valor {StaticResource MyBrush} para el fondo propiedad botón, la lógica de búsqueda de recursos comprueba en primer lugar el diccionario de recursos para la botón elemento. Si botón 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 botón, que es página. Por lo tanto, al definir un recurso en el página elemento raíz, todos los elementos en el árbol lógico de la página puede tener acceso a él y puede reutilizar el mismo recurso para establecer el valor de cualquier propiedad que acepta el tipo que representa el recurso. En el ejemplo anterior, el mismo MyBrush recursos establecen dos propiedades diferentes: la fondo de un botóny el rellenar de un rectángulo.

Puede hacer referencia a un recurso como un recurso estático o un recurso dinámico. Esto se hace utilizando la extensión de marcado StaticResource o extensión de marcado DynamicResource. Una extensión de marcado es una característica de XAML según el cual se puede especificar una referencia de objeto que tiene la extensión de marcado procesar la cadena del atributo y devolver el objeto a un XAML cargador. Para obtener más información sobre el comportamiento de la extensión de marcado, consulte las extensiones de marcado y XAML de WPF.

Cuando se utiliza una extensión de marcado, normalmente se 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úa en el contexto de la propiedad que se va a establecer. El extensión de marcado StaticResource procesa una clave buscando el valor para esa clave en todos los diccionarios de recursos disponibles. 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. El extensión de marcado DynamicResource en su lugar los procesos 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 que la expresión se evalúa y proporciona un valor.

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 en las siguientes consideraciones:

  • El diseño general de cómo crear los recursos de la aplicación (por página, en la aplicación, sueltos en XAML, en un ensamblado sólo de recursos).

  • ¿La funcionalidad de la aplicación: actualización de recursos en tiempo real forma parte de los requisitos de la aplicación?

  • El comportamiento de búsqueda respectivos de ese tipo de referencia de recurso.

  • La propiedad o tipo de recurso y el comportamiento nativo de esos tipos.

Recursos estáticos

Las referencias de recursos estáticos trabajo mejor en las siguientes circunstancias:

  • El diseño de la aplicación concentra la mayoría de todos sus recursos en la página o recurso de nivel de aplicación diccionarios. Referencias de recursos estáticos no se reevalúa 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.

  • Se establece el valor de una propiedad que no se encuentra en un DependencyObject o un Freezable.

  • Se crea un diccionario de recursos que se compilan en un archivo DLL y empaqueta como parte de la aplicación o compartido entre aplicaciones.

  • Se está creando un tema para un control personalizado y está definiendo recursos que se utilizan dentro de los temas. En este caso, normalmente no desea el comportamiento de búsqueda de referencia de recursos dinámicos, sino el comportamiento de referencia de recurso estático para que la búsqueda sea predecible e independiente para el tema. Con un recurso dinámico referencia, incluso que 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 redefina una clave a la que el tema está intentando hacer referencia a y el elemento local se encontrará antes que el tema en la búsqueda. Si esto sucede, el tema no se comportará de la manera esperada.

  • Recursos que usa para establecer un gran número de propiedades de dependencia. Propiedades de dependencia tienen valor efectivo la memoria caché habilitada en el sistema de propiedades, por lo que si proporciona un valor para una propiedad de dependencia que se puede evaluar en tiempo de carga, la propiedad de dependencia no tiene que comprobar si una expresión que se ha vuelto a evaluar y puede devolver el último valor efectivo. Esta técnica puede ser una ventaja de rendimiento.

  • Para cambiar el recurso subyacente para todos los consumidores o desea mantener instancias modificables independientes para cada consumidor utilizando la x: Shared Attribute.

Comportamiento de búsqueda de recursos estáticos

  1. El proceso de búsqueda comprueba la clave solicitada en el diccionario de recursos definida por el elemento que establece la propiedad.

  2. El proceso de búsqueda, a continuación, recorre el árbol lógico hacia arriba, el elemento primario y su diccionario de recursos. Este proceso continúa hasta que se alcanza el elemento raíz.

  3. A continuación, se comprueban los recursos de la aplicación. Recursos de la aplicación son aquellos recursos dentro del diccionario de recursos definido por el aplicación objeto para su Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'. aplicación.

Referencias de recursos estáticos desde dentro de un diccionario de recursos deben hacer referencia a un recurso que ya se ha definido léxicamente antes que la referencia de recurso. No se puede resolver las referencias adelantadas mediante una referencia de recurso estático. Por este motivo, si utiliza referencias de recursos estáticos, debe diseñar la estructura de diccionario de recursos que se definen los recursos pensados para uso en o cerca del principio de los respectivos diccionarios.

Puede ampliar la búsqueda de recursos estáticos en temas o en los recursos del sistema, pero esto sólo se admite porque el XAML cargador aplaza la solicitud. El aplazamiento es necesario para que se aplica el tema en tiempo de ejecución en el momento en que la página se carga correctamente a la aplicación. Sin embargo, referencias de recursos estáticos a claves que se sabe que sólo existen en temas o como no se recomiendan los recursos del sistema. Esto es porque esas referencias no se vuelven a evaluar si el tema cambia por el usuario en tiempo real. Una referencia de recurso dinámico es más confiable cuando solicitan recursos del tema o del sistema. La excepción es cuando el propio elemento del tema solicita otro recurso. Estas referencias deberían ser referencias de recursos estáticos, por las razones mencionadas anteriormente.

El comportamiento de excepción si no se encuentra una referencia de recurso estático varía. Si se aplaza el recurso, la excepción se produce en tiempo de ejecución. Si no se difirió el recurso, la excepción se produce en tiempo de carga.

Recursos dinámicos

Recursos dinámicos funcionan mejor en las circunstancias siguientes:

  • El valor del recurso depende de condiciones que no se conocen hasta el tiempo de ejecución. Esto incluye los recursos del sistema o recursos que son configurables por el usuario en caso contrario. Por ejemplo, puede crear valores de establecedor que hacen referencia a propiedades del sistema, tal como lo expone SystemColors, SystemFonts, o SystemParameters. Estos valores son auténticamente dinámicos porque proceden el entorno en tiempo de ejecución del usuario y del sistema operativo. También es posible que tenga temas de nivel de aplicación que pueden cambiar, donde el acceso a recursos de nivel de página también debe capturar el cambio.

  • Está creando o hacer referencia a los estilos del tema para un control personalizado.

  • Se va a ajustar el contenido de un ResourceDictionary durante un período de duración de la aplicación.

  • Tiene una estructura de recursos compleja que tiene interdependencias, donde puede requerirse una referencia adelantada. Referencias de recursos estáticos no admiten referencias adelantadas, pero las referencias de recursos dinámicos son compatibles con ellos porque no es necesario que el recurso se evalúan hasta el tiempo de ejecución y referencias adelantadas, por tanto, no son un concepto relevante.

  • Hace referencia a un recurso que es especialmente grande desde la perspectiva de compilación o espacio de trabajo y el recurso no podría utilizarse inmediatamente cuando se carga la página. Referencias de recursos estáticos siempre se cargan desde XAML cuando se cargue la página; sin embargo, una referencia de recurso dinámico no se carga hasta que se usa realmente.

  • Se crea un estilo donde valores establecedor podrían provenir de otros valores que se ven afectadas por los temas u otra configuración de usuario.

  • Está aplicando recursos a elementos que podrían ser cambia de elemento primario en el árbol lógico durante la duración de la aplicación. Cambiar el elemento primario potencialmente también cambia el ámbito de búsqueda de recursos, por lo que si desea que el recurso de un elemento primario a evaluarse según el nuevo ámbito, utilice siempre una referencia de recurso dinámico.

Comportamiento de búsqueda de recursos dinámicos

Comportamiento de búsqueda de recursos de una referencia de recurso dinámico es similar al comportamiento de búsqueda en el código a si se llama a FindResource o SetResourceReference.

  1. El proceso de búsqueda comprueba la clave solicitada en el diccionario de recursos definida por el elemento que establece la propiedad.

  2. El proceso de búsqueda, a continuación, recorre el árbol lógico hacia arriba, el elemento primario y su diccionario de recursos. Este proceso continúa hasta que se alcanza el elemento raíz.

  3. A continuación, se comprueban los recursos de la aplicación. Recursos de la aplicación son aquellos recursos dentro del diccionario de recursos definido por el aplicación objeto para su Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'. aplicación.

  4. Diccionario de recursos está activada, el tema activo actualmente. Si el tema cambia en tiempo de ejecución, se vuelve a evaluar el valor.

  5. Se comprueban los recursos del sistema.

Comportamiento de excepción (si existe) varía:

  • Si se solicita un recurso mediante un FindResource llamar y no se encuentra, se produce una excepción.

  • Si se solicita un recurso mediante un TryFindResource llamada y no se encontró ninguna excepción, pero el valor devuelto es null. Si la propiedad establecida no acepta null, es posible que se producirá una excepción más profunda (Esto depende de la propiedad individual que se va a establecer).

  • Si se solicita un recurso mediante una referencia de recurso dinámico en XAMLy fue no se encuentra, 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. Por ejemplo, si se intenta establecer el fondo de un elemento de botón individual utilizando un recurso que no se pudo evaluar, a continuación, ningún conjunto de valores, pero el valor efectivo todavía puede proceder de otros participantes en la prioridad de sistema y el valor de propiedad. Por ejemplo, el valor del fondo todavía podría proceder de un estilo de botón definido localmente o del estilo del tema. Para las propiedades que no están definidos en los estilos del tema, el valor efectivo después de una evaluación de recursos con errores podría proceder del valor predeterminado en los metadatos de propiedad.

Restricciones

Referencias de recursos dinámicos tienen algunas restricciones importantes. Debe cumplirse al menos uno de los siguientes:

Dado que la propiedad que se establece debe ser una DependencyProperty o Freezable propiedad, pueden propagar la mayoría de los cambios de propiedad a la interfaz de usuario porque un cambio de propiedad (el valor de recurso dinámico modificado) está confirmado por el sistema de propiedades. La mayoría de los controles incluyen lógica que forzará otro diseño de un control si un DependencyProperty cambios y que propiedad podría afectar al diseño. Sin embargo, no todas las propiedades que tienen un extensión de marcado DynamicResource como su valor se garantiza que proporcione el valor de tal manera que actualizar en tiempo real en la interfaz de usuario. Esa funcionalidad podría variar dependiendo de la propiedad, así como del tipo que posee la propiedad, o incluso la estructura lógica de la aplicación.

Anteriormente, hemos dicho que todos los elementos de un ResourceDictionary deben tener una clave. Sin embargo, eso no significa que todos los recursos deben tener una explícita x:Key. Varios tipos de objetos admiten una clave implícita cuando se define como un recurso, donde el valor de clave está vinculado al valor de otra propiedad. Esto se conoce como una clave implícita, mientras que un x:Key atributo es una clave explícita. Puede sobrescribir cualquier clave implícita especificando una clave explícita.

Un escenario muy importante para los recursos es al definir una estilo. De hecho, un estilo casi siempre se define como una entrada en un diccionario de recursos, porque los estilos están pensados intrínsecamente para su reutilización. Para obtener más información sobre los estilos, consulte estilos y plantillas.

Estilos para los controles se pueden crear con y hace referencia a una clave implícita. Los estilos del tema que definen la apariencia predeterminada de un control se basan en esta clave implícita. La clave implícita desde el punto de vista de solicitarlo es el tipo del propio control. La clave implícita desde el punto de vista de la definición del recurso es el TargetType del estilo. Por lo tanto, si está creando temas para controles personalizados, crear estilos que interactúan con estilos de tema existentes no necesita especificar un x: Key (directiva) para que estilo. Y si desea utilizar los estilos de tema, no necesitará especificar cualquier estilo en absoluto. Por ejemplo, la definición de estilo siguiente funciona, aunque el estilo recursos no parecen tener una clave:

    <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( botón). En el marcado, puede especificar un TargetType directamente como el tipo de nombre (o puede utilizar opcionalmente {x: Type...} para devolver un tipo.

A través de los mecanismos de estilo del tema predeterminado utilizados por Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'., que se aplica el estilo como estilo de tiempo de ejecución de un botón en la página, incluso aunque el botón propio no intenta especificar su estilo propiedad o una referencia de recurso específicos al estilo. El estilo definido en la página se encuentra anteriormente en la secuencia de búsqueda anteriores a estilo, con la misma clave que tiene el estilo de diccionario de tema. También podría 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. Si lo desea, puede clave explícitamente el estilo con el mismo tipo de valor como TargetType, para mayor claridad en el marcado, pero que es opcional.

Las claves implícitas para los estilos no se aplican en un control si OverridesDefaultStyle es true (tenga en cuenta también que OverridesDefaultStyle se podría establecer como parte del comportamiento nativo para la clase de control, en lugar de explícitamente en una instancia del control). Además, para admitir las claves implícitas para los escenarios de clase derivada, el control debe invalidar DefaultStyleKey (todos los controles existentes proporcionados como parte de Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"91580b89-a0a8-4889-aecb-fddf8e63175f","entity_type":"Article","locale":"es-ES"}'. hacerlo). Para obtener más información sobre los estilos, temas y diseño de control, consulte directrices para diseñar controles con estilos.

DataTemplate también tiene una clave implícita. La clave implícita para un DataTemplate es el DataType valor de propiedad. Tipo de datos también puede especificarse como el nombre del tipo en lugar de forma explícita mediante {x: Type...} . Para obtener más información, consulte información general sobre plantillas de datos.

ResourceDictionary
Recursos de la aplicación
Recursos y código
Definir y hacer referencia a un recurso
Introducción a Application Management
Extensión de marcado x: Type
Extensión de marcado StaticResource
Extensión de marcado DynamicResource

Mostrar: