Jak definovat a odkazovat na prostředek WPF (WPF .NET)

Tento příklad ukazuje, jak definovat prostředek a odkazovat na něj. Na prostředek se dá odkazovat prostřednictvím XAML nebo kódu.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Příklad XAML

Následující příklad definuje dva typy prostředků: SolidColorBrush prostředek a několik Style prostředků.

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

Zdroje informací

Prostředek SolidColorBrushMyBrush se používá k zadání hodnoty několika vlastností, které mají Brush každá hodnotu typu. Na tento prostředek se odkazuje prostřednictvím x:Key hodnoty.

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

V předchozím příkladu MyBrush se k prostředku přistupuje pomocí rozšíření značek StaticResource. Zdroj je přiřazen k vlastnosti, která může přijmout typ definovaného prostředku. V tomto případě , BackgroundForegrounda Fill vlastnosti.

Všechny prostředky v diktování prostředků musí obsahovat klíč. Pokud jsou ale styly definované, můžou klíč vynechat, jak je vysvětleno v další části.

Prostředky jsou také požadovány pořadím nalezeným ve slovníku, pokud použijete Rozšíření značek StaticResource k odkazování z jiného prostředku. Ujistěte se, že všechny prostředky, na které odkazujete, jsou definovány v kolekci dříve, než je požadován prostředek. Další informace naleznete v tématu Statické prostředky.

V případě potřeby můžete místo toho použít rozšíření značek DynamicResource k odkazování na prostředek za běhu striktní pořadí vytváření odkazů na prostředky, ale měli byste si uvědomit, že tato DynamicResource technika má důsledky výkonu. Další informace naleznete v tématu Dynamické prostředky.

Prostředky stylů

Následující příklad odkazuje na styly implicitně a explicitně:

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

V předchozím příkladu Style kódu prostředky TitleText a Labelkaždý cílí na konkrétní typ ovládacího prvku. V tomto případě oba cílí na TextBlock. Styly nastavují různé vlastnosti cílových ovládacích prvků, pokud na tento prostředek stylu odkazuje jeho klíč prostředku pro Style vlastnost.

Styl, který cílí na Border ovládací prvek, ale nedefinuje klíč. Pokud je klíč vynechán, typ objektu TargetType , který je cílem vlastnosti, se implicitně používá jako klíč pro styl. Když je styl klíč k typu, stane se výchozím stylem pro všechny ovládací prvky tohoto typu, pokud jsou tyto ovládací prvky v rozsahu stylu. Další informace naleznete v tématu Styly, DataTemplates a implicitní klíče.

Příklady kódu

Následující fragmenty kódu demonstrují vytváření a nastavení prostředků prostřednictvím kódu.

Vytvoření prostředku stylu

K vytvoření prostředku a jeho přiřazení ke slovníku prostředků může dojít kdykoli. Po vytvoření prostředku se ale automaticky aktualizují pouze elementy XAML, které používají syntaxi DynamicResource.

Podívejte se například na následující okno. Má čtyři tlačítka. Tlačítko Zpět používá dynamicResource k vlastnímu stylu. Tento prostředek ale ještě neexistuje, takže vypadá jako normální tlačítko:

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

A window before a style is applied to a button

Následující kód se vyvolá při kliknutí na první tlačítko a provede následující úlohy:

  • Vytvoří některé barvy pro snadný odkaz.
  • Vytvoří nový styl.
  • Přiřazuje settery stylu.
  • Přidá styl jako prostředek pojmenovaný buttonStyle1 do slovníku prostředků okna.
  • Přiřadí styl přímo tlačítku, které Click událost vyvolává.
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

Po spuštění kódu se okno aktualizuje:

A window after a style is applied to a button

Všimněte si, že styl tlačítka na zásudce byl aktualizován. Styl se automaticky použil, protože tlačítko použilo rozšíření značek DynamicResource k odkazování na styl, který ještě neexistuje. Jakmile byl styl vytvořen a přidán do prostředků okna, použil se na tlačítko. Další informace naleznete v tématu Dynamické prostředky.

Vyhledání prostředku

Následující kód prochází logickým stromem objektu XAML, ve kterém je spuštěn, a vyhledá zadaný prostředek. Prostředek může být definován na samotném objektu, je nadřazený, až do kořenového adresáře, samotné aplikace. Následující kód vyhledá prostředek, počínaje samotným tlačítkem:

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

Explicitní odkaz na prostředek

Pokud máte odkaz na prostředek, a to buď tak, že ho vyhledáte nebo vytvoříte, můžete ho přiřadit přímo k vlastnosti:

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

Viz také