Compartir a través de


Cómo definir y hacer referencia a un recurso de WPF

En este ejemplo se muestra cómo definir un recurso y hacer referencia a él. Se puede hacer referencia a un recurso a través de XAML o mediante código.

Ejemplo de XAML

En el ejemplo siguiente se definen dos tipos de recursos: un SolidColorBrush recurso y varios Style recursos.

<Window.Resources>
    <SolidColorBrush x:Key="MyBrush" Color="#05E0E9"/>
    <Style TargetType="Border">
        <Setter Property="Background" Value="#4E1A3D" />
        <Setter Property="BorderThickness" Value="5" />
        <Setter Property="BorderBrush">
            <Setter.Value>
                <LinearGradientBrush>
                    <GradientStop Offset="0.0" Color="#4E1A3D"/>
                    <GradientStop Offset="1.0" Color="Salmon"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="TextBlock" x:Key="TitleText">
        <Setter Property="FontSize" Value="18"/>
        <Setter Property="Foreground" Value="#4E87D4"/>
        <Setter Property="FontFamily" Value="Trebuchet MS"/>
        <Setter Property="Margin" Value="0,10,10,10"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
        <Setter Property="HorizontalAlignment" Value="Right"/>
        <Setter Property="FontSize" Value="13"/>
        <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>
</Window.Resources>

Recursos

El SolidColorBrush recurso MyBrush se usa para proporcionar el valor de varias propiedades que requieren un valor de tipo Brush. Este recurso se referencia a través del valor x:Key.

<Border>
    <StackPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
    </StackPanel>
</Border>

En el ejemplo anterior, se accede al MyBrush recurso utilizando la Extensión de Marcado StaticResource. El recurso se asigna a una propiedad que puede aceptar el tipo de recurso que se va a definir. En este caso, las propiedades Background, Foreground y Fill.

Todos los recursos en un diccionario de recursos deben proporcionar una clave. Sin embargo, cuando se definen estilos, pueden omitir la clave, como se explica en la sección siguiente.

Los recursos se solicitan en el orden que se encuentran en el diccionario si utiliza la extensión de marcado StaticResource para referenciarlos desde otro recurso. Asegúrese de que cualquier recurso al que haga referencia esté definido en la colección anterior a donde se solicita ese recurso. Para obtener más información, consulte Recursos estáticos.

Si es necesario, puede eludir el orden estricto de creación de referencias de recursos utilizando una extensión de marcado DynamicResource para hacer referencia al recurso en tiempo de ejecución; aunque debe tener en cuenta que esta DynamicResource técnica tiene consecuencias de rendimiento. Para obtener más información, consulte Recursos dinámicos.

Recursos de estilo

En el ejemplo siguiente se hace referencia a estilos implícita y explícitamente:

<Border>
    <StackPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
    </StackPanel>
</Border>

En el ejemplo de código anterior, los Style recursos TitleText y Label, cada uno tiene como destino un tipo de control determinado. En este caso, ambos tienen como destino un TextBlock. Los estilos establecen una variedad de propiedades diferentes en los controles de destino cuando se hace referencia a ese recurso de estilo mediante su clave de recurso para la Style propiedad .

Aunque el estilo que tiene como destino un Border control no define una clave. Cuando se omite una clave, el tipo de objeto dirigido por la TargetType propiedad se usa implícitamente como clave para el estilo. Cuando un estilo se clave en un tipo, se convierte en el estilo predeterminado para todos los controles de ese tipo, siempre y cuando estos controles estén dentro del ámbito del estilo. Para obtener más información, vea Estilos, DataTemplates y claves implícitas.

Ejemplos de código

Los siguientes fragmentos de código muestran cómo crear y establecer recursos mediante código

Creación de un recurso de estilo

La creación de un recurso y la asignación a un diccionario de recursos puede producirse en cualquier momento. Sin embargo, solo los elementos XAML que usan la sintaxis DynamicResource se actualizarán automáticamente con el recurso después de crearlo.

Tome como ejemplo la ventana siguiente. Tiene cuatro botones. El cuarto botón usa DynamicResource para estilizarse. Sin embargo, este recurso aún no existe, por lo que parece un botón normal:

<StackPanel Margin="5">
    <Button Click="Button_Click">Explicitly Styled</Button>
    <Button>Unstyled</Button>
    <Button>Unstyled</Button>
    <Button Style="{DynamicResource ResourceKey=buttonStyle1}">Dynamically Styled</Button>
</StackPanel>

Una ventana antes de aplicar un estilo a un botón

El código siguiente se invoca cuando se hace clic en el primer botón y realiza las siguientes tareas:

  • Crea algunos colores para facilitar la referencia.
  • Crea un nuevo estilo.
  • Asigna configuradores al estilo.
  • Agrega el estilo como un recurso denominado buttonStyle1 al diccionario de recursos de la ventana.
  • Asigna el estilo directamente al botón que desencadena el evento Click.
private void Button_Click(object sender, RoutedEventArgs e)
{
    // Create colors
    Color purple = (Color)ColorConverter.ConvertFromString("#4E1A3D");
    Color white = Colors.White;
    Color salmon = Colors.Salmon;

    // Create a new style for a button
    var buttonStyle = new Style(typeof(Button));

    // Set the properties of the style
    buttonStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(purple)));
    buttonStyle.Setters.Add(new Setter(Control.ForegroundProperty, new SolidColorBrush(white)));
    buttonStyle.Setters.Add(new Setter(Control.BorderBrushProperty, new LinearGradientBrush(purple, salmon, 45d)));
    buttonStyle.Setters.Add(new Setter(Control.BorderThicknessProperty, new Thickness(5)));

    // Set this style as a resource. Any DynamicResource tied to this key will be updated.
    this.Resources["buttonStyle1"] = buttonStyle;

    // Set this style directly to a button
    ((Button)sender).Style = buttonStyle;
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)

    'Create colors
    Dim purple = DirectCast(ColorConverter.ConvertFromString("#4E1A3D"), Color)
    Dim white = Colors.White
    Dim salmon = Colors.Salmon

    'Create a new style for a button
    Dim buttonStyle As New Style()

    'Set the properties of the style
    buttonStyle.Setters.Add(New Setter(Control.BackgroundProperty, New SolidColorBrush(purple)))
    buttonStyle.Setters.Add(New Setter(Control.ForegroundProperty, New SolidColorBrush(white)))
    buttonStyle.Setters.Add(New Setter(Control.BorderBrushProperty, New LinearGradientBrush(purple, salmon, 45D)))
    buttonStyle.Setters.Add(New Setter(Control.BorderThicknessProperty, New Thickness(5)))

    'Set this style as a resource. Any DynamicResource looking for this key will be updated.
    Me.Resources("buttonStyle1") = buttonStyle

    'Set this style directly to a button
    DirectCast(sender, Button).Style = buttonStyle

End Sub

Una vez que se ejecuta el código, la ventana se actualiza:

Una ventana después de aplicar un estilo a un botón

Observe que se actualizó el estilo del cuarto botón. El estilo se aplicó automáticamente porque el botón usó la extensión de marcado DynamicResource para hacer referencia a un estilo que aún no existía. Una vez creado el estilo y agregado a los recursos de la ventana, se aplicó al botón. Para obtener más información, consulte Recursos dinámicos.

Buscar un recurso

El código siguiente recorre el árbol lógico del objeto XAML en el que se ejecuta, para buscar el recurso especificado. Es posible que el recurso se defina en el propio objeto, es primario, hasta la raíz, la propia aplicación. El código siguiente busca un recurso, empezando por el propio botón:

myButton.Style = myButton.TryFindResource("buttonStyle1") as Style;
myButton.Style = myButton.TryFindResource("buttonStyle1")

Hacer referencia explícita a un recurso

Cuando tenga una referencia a un recurso, ya sea buscándolo o creándolo, se puede asignar directamente a una propiedad.

// Set this style as a resource. Any DynamicResource tied to this key will be updated.
this.Resources["buttonStyle1"] = buttonStyle;
'Set this style as a resource. Any DynamicResource looking for this key will be updated.
Me.Resources("buttonStyle1") = buttonStyle

Consulte también