web-dev-qa-db-fra.com

Définir le style de tous les blocs de texte dans un panneau de pile

Disons que j'ai deux panneaux de pile distincts et distincts (nous les appellerons SPA et SPB), chacun avec 10 blocs de texte en tant qu'éléments enfants. Tous les blocs de texte de SPA doivent utiliser un style et tous les blocs de texte de SPB doivent en utiliser un autre. Une façon d'accomplir ceci serait de déclarer les deux styles dans les ressources, puis d'ajouter Style="style1" aux 10 blocs de texte du premier panneau de pile et d'ajouter Style="style2" aux 10 du second. Cependant, il semble qu'il devrait exister un moyen simple d'ajouter un style au stackpanel lui-même, qui indique en quelque sorte à l'empileur de l'appliquer à tous les éléments enfants qui sont des blocs de texte. Y a-t-il un moyen de faire ça?

Si je cherche naturellement cette solution, c’est parce que c’est exactement comme cela que vous faites la même chose en HTML avec CSS, et j’espérai qu’il y aurait une fonctionnalité similaire à XAML avec un style.

Merci!

P.S. Je travaille avec Silverlight, mais je suppose que ma situation et quelle que soit la solution (s’il en existe une) s’applique à XAML/WPF en général.

37
JoeCool

Dans la section des ressources de votre conteneur principal, mettez votre style avec un attribut x:Key et un type de cible de TextBlock. Ensuite, dans chaque section de ressources pour chaque StackPanel, vous pouvez mettre un style où l'attribut BasedOn est défini sur la clé de votre style principal (n'oubliez pas d'utiliser la liaison StaticResource, pas seulement le nom de la clé), puis dites TargetType="{x:Type TextBlock}" et fin le tag. Cela devrait apporter le style dans StackPanel et styliser tous vos TextBlocks.

<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

Pour ce faire, vous pouvez redéfinir le style de bloc de texte par défaut dans les ressources de chaque panneau de pile:

<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

J'ai trouvé une bonne solution pour cela ici . Voici l'exemple de code -

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

J'espère que cela aiderait.

0
ShaileshDev