Подтвердить что ты не робот

Установить стиль для всех текстовых блоков в панели стека

Скажем, у меня есть две разные, отдельные панели стека (мы будем называть их SPA и SPB), каждая из которых содержит 10 текстовых блоков в качестве дочерних элементов. Все текстовые блоки в SPA должны использовать один стиль, и все текстовые блоки в SPB должны использовать другой. Один из способов добиться этого - объявить два стиля в разделе "Ресурсы", а затем добавить Style="style1" ко всем 10 текстовым блокам в первой панели стека и добавить Style="style2" ко всем 10 во втором. Тем не менее, кажется, что должен быть какой-то простой способ добавить стиль к самой панели стека, которая каким-то образом сообщает панели стека применить ее ко всем дочерним элементам, которые являются текстовыми блоками. Есть ли способ сделать это?

Причина, по которой я, естественно, ищу это решение, состоит в том, что именно так вы делаете то же самое в HTML с CSS, и я надеялся, что с XAML будет похожая функция с стилем.

Спасибо!

P.S. Я работаю с Silverlight, но я предполагаю, что моя ситуация и любое решение (если оно есть) применимо к XAML/WPF вообще.

4b9b3361

Ответ 1

В разделе ресурсов вашего основного контейнера введите свой стиль с атрибутом x:Key и целевым типом TextBlock. Затем в каждом разделе ресурсов для каждого StackPanel вы можете поместить стиль, в котором атрибут BasedOn установлен на ключ вашего основного стиля (не забудьте использовать привязку StaticResource, а не только имя ключа), а затем произнесите TargetType="{x:Type TextBlock}" и завершите тег. это должно привнести стиль в StackPanel и стилизовать все ваши текстовые блоки.

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

Ответ 2

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

Ответ 3

Вы можете выполнить это, переопределив стиль текстового блока по умолчанию в Ресурсах каждой панели стека:

<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

Я нашел одно хорошее решение для него здесь. Ниже приведен пример кода -

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

Надеюсь, это поможет.