Dela via


Definiera och referera till en WPF-resurs (WPF .NET)

Det här exemplet visar hur du definierar en resurs och refererar till den. En resurs kan refereras via XAML eller via kod.

XAML-exempel

I följande exempel definieras två typer av resurser: en SolidColorBrush resurs och flera Style resurser.

<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>

Resurser

Den SolidColorBrush resursen MyBrush används för att ange värdet för flera egenskaper som var och en tar ett Brush typvärde. Den här resursen refereras via värdet 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>

I föregående exempel används MyBrush resursen med StaticResource Markup-tillägget. Resursen tilldelas en egenskap som kan acceptera den typ av resurs som definieras. I det här fallet egenskaperna Background, Foregroundoch Fill.

Alla resursenheter i en resursordlista måste tillhandahålla en nyckel. När formatmallar definieras kan de utelämna nyckeln, som förklaras i nästa avsnitt .

Resurser begärs också i den ordning som anges i ordlistan om du använder StaticResource Markup Extension för att hänvisa till dem från en annan resurs. Kontrollera att alla resurser som du refererar till har definierats i samlingen tidigare än där resursen begärs. Mer information finns i Statiska resurser.

Om det behövs kan du kringgå den strikta skapandeordningen av resursreferenser med hjälp av ett DynamicResource Markup-tillägg för att referera till resursen vid körning i stället, men du bör vara medveten om att den här DynamicResource tekniken har prestandakonsekvenser. Mer information finns i Dynamiska resurser.

Formatresurser

Följande exempel refererar till format implicit och explicit:

<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>

I föregående kodexempel riktar sig resurserna Style, TitleText och Label, var och en mot en viss kontrolltyp. I det här fallet riktar de båda in sig på en TextBlock. Formatmallarna anger en mängd olika egenskaper för de riktade kontrollerna när den formatresursen refereras av dess resursnyckel för egenskapen Style.

Stilen, dock, som är riktad mot en kontroll av typen Border definierar inte en nyckel. När en nyckel utelämnas, används objektets typ som riktas mot egenskapen TargetType implicit som nyckel för stilen. När ett format är nyckelat till en typ blir det standardformatet för alla kontroller av den typen, så länge dessa kontroller ligger inom omfånget för formatet. För mer information, se Formatmallar, DataTemplates och implicita nycklar.

Kodexempel

Följande kodfragment visar hur du skapar och ställer in resurser via kod

Skapa en formatresurs

När du skapar en resurs och tilldelar den till en resursordlista kan det hända när som helst. Men endast XAML-element som använder DynamicResource-syntaxen uppdateras automatiskt med resursen när den har skapats.

Ta till exempel följande fönster. Den har fyra knappar. Knappen Forth använder en DynamicResource- för att formatera sig själv. Den här resursen finns dock inte än, så den ser bara ut som en normal knapp:

<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>

Ett fönster innan ett format tillämpas på en knapp

Följande kod anropas när den första knappen klickas och utför följande uppgifter:

  • Skapar några färger för enkel referens.
  • Skapar ett nytt format.
  • Tilldelar setters till formatet.
  • Lägger till formatet som en resurs med namnet buttonStyle1 i fönstrets resursordlista.
  • Tilldelar direkt formatmallen till knappen som utlöser händelsen 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

När koden har körts uppdateras fönstret:

Ett fönster när ett format har tillämpats på en knapp

Observera att formatmallen för den fjärde knappen uppdaterades. Formatet tillämpades automatiskt eftersom knappen använde DynamicResource Markup Extension för att referera till ett format som ännu inte fanns. När formatmallen skapades och lades till i fönstrets resurser tillämpades den på knappen. Mer information finns i Dynamiska resurser.

Hitta en resurs

Följande kod passerar det logiska trädet för XAML-objektet som körs för att hitta den angivna resursen. Resursen kan definieras på själva objektet, dess förälder, hela vägen till roten och slutligen på själva programmet. Följande kod söker efter en resurs och börjar med själva knappen:

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

Referera uttryckligen till en resurs

När du har referens till en resurs, antingen genom att söka efter den eller genom att skapa den, kan den tilldelas till en egenskap direkt:

// 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

Se även