Установить стиль для всех текстовых блоков в панели стека
Скажем, у меня есть две разные, отдельные панели стека (мы будем называть их SPA и SPB), каждая из которых содержит 10 текстовых блоков в качестве дочерних элементов. Все текстовые блоки в SPA должны использовать один стиль, и все текстовые блоки в SPB должны использовать другой. Один из способов добиться этого - объявить два стиля в разделе "Ресурсы", а затем добавить Style="style1"
ко всем 10 текстовым блокам в первой панели стека и добавить Style="style2"
ко всем 10 во втором. Тем не менее, кажется, что должен быть какой-то простой способ добавить стиль к самой панели стека, которая каким-то образом сообщает панели стека применить ее ко всем дочерним элементам, которые являются текстовыми блоками. Есть ли способ сделать это?
Причина, по которой я, естественно, ищу это решение, состоит в том, что именно так вы делаете то же самое в HTML с CSS, и я надеялся, что с XAML будет похожая функция с стилем.
Спасибо!
P.S. Я работаю с Silverlight, но я предполагаю, что моя ситуация и любое решение (если оно есть) применимо к XAML/WPF вообще.
Ответы
Ответ 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>
Надеюсь, это поможет.