it-swarm.com.de

Legen Sie den Stil für alle Textblöcke in einem Stapelbereich fest

Nehmen wir an, ich habe zwei unterschiedliche Stack-Panels (wir nennen sie SPA und SPB) mit jeweils 10 Textblöcken als untergeordnete Elemente. Alle Textblöcke in SPA sollten einen Stil verwenden, und alle Textblöcke in SPB sollten einen anderen verwenden. Eine Möglichkeit, dies zu erreichen, wäre die Deklaration der beiden Stile in Resources, das Anhängen von Style="style1" an alle 10 Textblöcke im ersten Stapelbereich und das Anhängen von Style="style2" an alle 10 im zweiten. Es scheint jedoch, dass es einen einfachen Weg geben sollte, einen Stil an das Stackpanel selbst anzuhängen, der das Stackpanel anweist, es auf alle untergeordneten Elemente anzuwenden, die Textblöcke sind. Gibt es überhaupt etwas zu tun?

Der Grund, warum ich natürlich nach dieser Lösung Ausschau halte, ist, dass Sie in HTML mit CSS dasselbe tun, und ich hatte gehofft, dass es eine ähnliche Funktion wie XAML mit Styling gibt.

Vielen Dank!

P.S. Ich arbeite mit Silverlight, aber ich schätze, dass meine Situation und welche Lösung (falls vorhanden) für XAML/WPF allgemein gilt.

37
JoeCool

Fügen Sie im Ressourcenbereich für Ihren Hauptcontainer Ihren Stil mit einem x:Key-Attribut und dem Zieltyp TextBlock ein. Dann können Sie in jedem Ressourcenabschnitt für jede StackPanel einen Stil setzen, in dem das BasedOn-Attribut auf den Schlüssel Ihres Hauptstils gesetzt ist (vergessen Sie nicht, die StaticResource-Bindung und nicht nur den Namen des Schlüssels zu verwenden) und dann TargetType="{x:Type TextBlock}" und end zu sagen der tag Dies sollte den Style in das StackPanel bringen und alle Ihre TextBlocks formatieren.

<Window ...>
    <Window.Resources>
        <Style x:Key="tbstyle" TargetType="{x:Type TextBlock}">
            <!-- put setters here -->
        </Style>
    </Window.Resources>
    <StackPanel name="SPA">
        <StackPanel.Resources>
            <Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" />
        </StackPanel.Resources>
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
    </Stackpanel>
    <StackPanel name="SPB">
        <StackPanel.Resources>
            <Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" />
        </StackPanel.Resources>
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
        <TextBlock ... />
    </StackPanel>
</Window>
59
Scott M.
<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin"
                    Value="5" />
        </Style>
    </StackPanel.Resources>
    <TextBlock Text="Text" />
    <TextBlock Text="Text" />
    <TextBlock Text="Text" />
    <TextBlock Text="Text" />
</StackPanel>
14
decyclone

Sie können dies erreichen, indem Sie den Standardtextblockstil in den Ressourcen der einzelnen Stapelbedienfelder überschreiben:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background"
                    Value="Red"/>
        </Style>
    </StackPanel.Resources>

    <TextBlock .../>
    <TextBlock .../>
    <TextBlock .../>
    <TextBlock .../>
</StackPanel>

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background"
                    Value="Green"/>
        </Style>                
    </StackPanel.Resources>

    <TextBlock .../>
    <TextBlock .../>
    <TextBlock .../>
    <TextBlock .../>
</StackPanel>
4
Pavlo Glazkov

Ich habe eine gute Lösung dafür gefunden hier . Unten ist der Beispielcode -

<Window x:Class="WpfTutorialSamples.Styles.WindowWideStyleSample"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="WindowWideStyleSample" Height="200" Width="300">
<Window.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="Gray" />
        <Setter Property="FontSize" Value="24" />
    </Style>
</Window.Resources>
<StackPanel Margin="10">
    <TextBlock>Header 1</TextBlock>
    <TextBlock>Header 2</TextBlock>
    <TextBlock Foreground="Blue">Header 3</TextBlock>
</StackPanel>

Ich hoffe das würde helfen.

0
ShaileshDev