web-dev-qa-db-ja.com

スタックパネルのすべてのテキストブロックのスタイルを設定する

2つの異なるスタックパネル(SPAとSPBと呼びます)があり、それぞれに子要素として10個のテキストブロックがあるとします。 SPAのすべてのテキストブロックは1つのスタイルを使用し、SPBのすべてのテキストブロックは別のスタイルを使用する必要があります。これを行う1つの方法は、リソースで2つのスタイルを宣言し、最初のスタックパネルの10個すべてのテキストブロックにStyle="style1"を追加し、2番目のスタックパネルの10個すべてにStyle="style2"を追加することです。ただし、スタイルをスタックパネル自体に追加する簡単な方法があるはずです。これにより、テキストブロックであるすべての子要素にスタイルを適用するようにスタックパネルに指示することができます。とにかくこれを行うにはありますか?

私が自然にこのソリューションを探す理由は、これがまさにCSSを使用してHTMLで同じようなことを行う方法であり、スタイルを設定したXAMLと同様の機能があることを望んでいたからです。

ありがとう!

追伸私はSilverlightを使用していますが、私の状況と、一般的にXAML/WPFに適用される解決策(存在する場合)を推測しています。

36
JoeCool

メインコンテナーのリソースセクションで、x:Key属性およびターゲットタイプTextBlock。次に、各StackPanelの各リソースセクションに、BasedOn属性がメインスタイルのキーに設定されているスタイルを配置できます(名前だけでなく、StaticResourceバインディングを使用することを忘れないでください)キーの)、次にTargetType="{x:Type TextBlock}"でタグを終了します。これにより、スタイルがStackPanelに取り込まれ、すべてのTextBlockがスタイルされます。

<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>
61
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>
15
decyclone

これは、各スタックパネルのリソースでデフォルトのテキストブロックスタイルをオーバーライドすることで実現できます。

<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

私はそれに良い解決策を見つけました here 。以下はサンプルコードです-

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

これがお役に立てば幸いです。

0
ShaileshDev