Compartir a través de


Extensión de marcado {StaticResource}

Proporciona un valor para cualquier atributo XAML mediante la evaluación de una referencia a un recurso ya definido. Los recursos se definen en resourceDictionary y un uso staticResource hace referencia a la clave de ese recurso en ResourceDictionary.

Uso del atributo XAML

<object property="{StaticResource key}" .../>

Valores de XAML

Término Descripción
key Clave del recurso solicitado. Esta clave se asigna inicialmente mediante ResourceDictionary. Una clave de recurso puede ser cualquier cadena que se defina con la gramática XamlName.

Comentarios

StaticResource es una técnica para obtener valores para un atributo XAML que se definen en otra parte de un diccionario de recursos XAML. Los valores se pueden colocar en un diccionario de recursos porque están diseñados para compartirse con varios valores de propiedad o porque se usa un diccionario de recursos XAML como técnica de empaquetado o factorización XAML. Un ejemplo de una técnica de empaquetado XAML es el diccionario de temas de un control. Otro ejemplo es los diccionarios de recursos combinados que se usan para la reserva de recursos.

StaticResource toma un argumento, que especifica la clave del recurso solicitado. Una clave de recurso siempre es una cadena en XAML de Windows Runtime. Para obtener más información sobre cómo se especifica inicialmente la clave de recurso, consulte el atributo x:Key.

Las reglas por las que staticResource se resuelve en un elemento de un diccionario de recursos no se describen en este tema. Esto depende de si la referencia y el recurso existen en una plantilla, si se usan diccionarios de recursos combinados, etc. Para obtener más información sobre cómo definir recursos y usar correctamente un ResourceDictionary, incluido el código de ejemplo, consulta Referencias a recursos XAML y ResourceDictionary.

Importante Un staticResource no debe intentar hacer una referencia directa a un recurso que se define léxicamente más dentro del archivo XAML. No se admite el intento de hacerlo. Incluso si no se produce un error en la referencia hacia delante, al intentar que se produzca una penalización de rendimiento. Para obtener los mejores resultados, ajuste la composición de los diccionarios de recursos para evitar las referencias de reenvío.

Al intentar especificar staticResource en una clave que no se puede resolver, se produce una excepción de análisis XAML en tiempo de ejecución. Las herramientas de diseño también pueden ofrecer advertencias o errores.

En la implementación del procesador XAML de Windows Runtime, no hay ninguna representación de clase de respaldo para la funcionalidad StaticResource . StaticResource se usa exclusivamente en XAML. El equivalente más cercano en el código es usar la API de colección de un ResourceDictionary, por ejemplo, llamar a Contains o TryGetValue.

La extensión de marcado {ThemeResource} es una extensión de marcado similar que hace referencia a recursos con nombre en otra ubicación. La diferencia es que la extensión de marcado {ThemeResource} tiene la capacidad de devolver recursos diferentes en función del tema del sistema que esté activo. Para obtener más información, consulta extensión de marcado {ThemeResource}.

StaticResource es una extensión de marcado. Las extensiones de marcado se suelen implementar cuando se necesita que los valores de los atributos de escape no sean valores literales o nombres de controladores, y este requisito es de índole más global que limitarse a colocar los convertidores de tipos en determinados tipos o propiedades. Todas las extensiones de marcado en XAML usan los caracteres "{" y "}" en su sintaxis de atributo, que es la convención por la que un procesador XAML reconoce que una extensión de marcado debe procesar el atributo.

Ejemplo de uso de {StaticResource}

Este código XAML de ejemplo se toma del ejemplo de enlace de datos XAML.

<StackPanel Margin="5">
    <!-- Add converter as a resource to reference it from a Binding. --> 
    <StackPanel.Resources>
        <local:S2Formatter x:Key="GradeConverter"/>
    </StackPanel.Resources>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Percent grade:" Margin="5" />
    <Slider x:Name="sliderValueConverter" Minimum="1" Maximum="100" Value="70" Margin="5"/>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Letter grade:" Margin="5"/>
    <TextBox x:Name="tbValueConverterDataBound"
      Text="{Binding ElementName=sliderValueConverter, Path=Value, Mode=OneWay,  
        Converter={StaticResource GradeConverter}}" Margin="5" Width="150"/> 
</StackPanel> 

En este ejemplo concreto se crea un objeto respaldado por una clase personalizada y se crea como un recurso en un ResourceDictionary. Para ser un recurso válido, este local:S2Formatter elemento también debe tener un valor de atributo x:Key . El valor del atributo se establece en "GradeConverter".

A continuación, el recurso se solicita un poco más en el XAML, donde ves {StaticResource GradeConverter}.

Observe cómo el uso de la extensión de marcado {StaticResource} establece una propiedad de otra extensión de marcado {Binding} extensión de marcado, por lo que hay dos usos de extensión de marcado anidados aquí. Primero se evalúa el interno, de modo que el recurso se obtiene primero y se puede usar como un valor. Este mismo ejemplo también se muestra en la extensión de marcado {Binding}.

Compatibilidad con herramientas en tiempo de diseño para la extensión de marcado {StaticResource}

Microsoft Visual Studio 2013 puede incluir posibles valores de clave en las listas desplegables de Microsoft IntelliSense cuando se usa la extensión de marcado {StaticResource} en una página XAML. Por ejemplo, en cuanto escriba "{StaticResource", cualquiera de las claves de recursos del ámbito de búsqueda actual se mostrará en las listas desplegables de IntelliSense. Además de los recursos típicos que tendrías en el nivel de página (FrameworkElement.Resources) y en el nivel de aplicación (Application.Resources), también verás recursos de temas XAML y recursos de cualquier extensión que use el proyecto.

Una vez que existe una clave de recurso como parte de cualquier uso de {StaticResource} , la característica Ir a definición (F12) puede resolver ese recurso y mostrar el diccionario donde está definido. Para los recursos del tema, esto va a generic.xaml para tiempo de diseño.