Megosztás a következőn keresztül:


WPF-erőforrás definiálása és hivatkozása

Ez a példa bemutatja, hogyan definiálhat és hivatkozhat rá egy erőforrást. Az erőforrások az XAML-ben vagy kódon keresztül is hivatkozhatók.

XAML-példa

Az alábbi példa kétféle erőforrástípust határoz meg: egy SolidColorBrush erőforrást és több Style erőforrást.

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

Erőforrások

A SolidColorBrush erőforrás MyBrush több tulajdonság értékét adja meg, amelyek mindegyike Brush típusú értéket vesz fel. Az erőforrásra a x:Key érték hivatkozik.

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

Az előző példában a MyBrush erőforrás a StaticResource markup kiterjesztéshasználatával érhető el. Az erőforrás egy olyan tulajdonsághoz van hozzárendelve, amely képes elfogadni a definiált erőforrás típusát. Ebben az esetben a Background, Foregroundés Fill tulajdonságokat.

Az erőforrás-szótárban lévő összes erőforrásnak kell hogy legyen egy kulcsa. Amikor azonban stílusok vannak definiálva, kihagyhatják a kulcsot, amint azt a következő szakaszbanelmagyarázzák.

Az erőforrások a szótárban található sorrend szerint kérhetők, ha a StaticResource Markup bővítményt használva hivatkozik azokra egy másik erőforrásból. Győződjön meg arról, hogy a hivatkozott erőforrások a gyűjteményben korábban vannak definiálva, mint ahol az erőforrást kérik. További információ: Statikus erőforrások.

Szükség esetén megkerülheti az erőforrás-hivatkozások szigorú létrehozási sorrendjét egy DynamicResource Markup bővítmény használatával, hogy futásidőben hivatkozzon az erőforrásra, de tisztában kell lennie azzal, hogy ennek a DynamicResource technikának teljesítménykövetkezményei vannak. További információ: Dinamikus erőforrások.

Stíluserőforrások

Az alábbi példa implicit módon és explicit módon hivatkozik a stílusokra:

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

Az előző kód példában a Style erőforrások TitleText és Label, amelyek mindegyike egy adott vezérlőtípust céloz meg. Ebben az esetben mindkettő egy TextBlockcéloz meg. A stílusok különböző tulajdonságokat határoznak meg a célzott vezérlőkön, ha a stíluserőforrásra a Style tulajdonság erőforráskulcsa hivatkozik.

A Border vezérlőelemet megcélzó stílus azonban nem határoz meg kulcsot. Ha kihagy egy kulcsot, a TargetType tulajdonság által megcélzott objektumtípus implicit módon lesz használva a stílus kulcsaként. Ha egy stílus egy típushoz van kapcsolva, az lesz az alapértelmezett stílus az adott típusú vezérlők esetében, amennyiben ezek a vezérlők a stílus hatókörén belül vannak. További információért lásd: Stílusok, DataTemplates és implicit kulcsok.

Példakódok

Az alábbi kódrészletek bemutatják az erőforrások kódon keresztüli létrehozását és beállítását

Stíluserőforrás létrehozása

Az erőforrás létrehozása és erőforrás-szótárhoz való hozzárendelése bármikor megtörténhet. Azonban csak a DynamicResource szintaxist használó XAML-elemek lesznek automatikusan frissítve az erőforrással a létrehozásuk után.

Vegyük például a következő ablakot. Négy gombja van. A negyedik gomb egy DynamicResource használatával van formázva. Ez az erőforrás azonban még nem létezik, ezért úgy néz ki, mint egy normál gomb:

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

Egy ablak stílusának alkalmazása előtt egy gombra

Az első gombra kattintáskor a rendszer a következő kódot hívja meg, és végrehajtja a következő feladatokat:

  • Néhány színt hoz létre a könnyű referencia érdekében.
  • Új stílust hoz létre.
  • Setterek hozzárendelése a stílushoz.
  • Hozzáadja a stílust buttonStyle1 nevű erőforrásként az ablak erőforrás-szótárához.
  • A stílust közvetlenül a Click eseményt növelő gombhoz rendeli.
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

A kód futtatása után az ablak frissül:

Egy ablak, miután egy stílust alkalmaztak egy gombra

Figyelje meg, hogy a következő gomb stílusa frissült. A stílus automatikusan alkalmazva lett, mert a gomb a DynamicResource markup bővítményt használta egy még nem létező stílusra való hivatkozáshoz. Miután létrehozta a stílust, és hozzáadta az ablak erőforrásaihoz, a gombra alkalmazták. További információ: Dinamikus erőforrások.

Erőforrás keresése

Az alábbi kód bejárja annak az XAML-objektumnak a logikai fáját, amelyben fut, és megkeresi a megadott erőforrást. Lehetséges, hogy az erőforrás az objektumon magán, annak szülőjén, egészen a gyökérig, azaz maga az alkalmazásig van meghatározva. Az alábbi kód egy erőforrást keres, a gombtól kezdve:

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

Explicit módon hivatkozzon egy erőforrásra

Ha egy erőforrásra hivatkozik, akár kereséssel, akár létrehozással, közvetlenül hozzárendelhető egy tulajdonsághoz:

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

Lásd még