wpf - style - Establecer el estilo para todos los bloques de texto en un panel de pila
wpf templates free (4)
Digamos que tengo dos paneles de pila diferentes y distintos (los llamaremos SPA y SPB), cada uno con 10 bloques de texto como elementos secundarios. Todos los bloques de texto en SPA deben usar un estilo, y todos los bloques de texto en SPB deben usar otro. Una forma de lograr esto sería declarar los dos estilos en Recursos y luego agregar Style="style1"
a los 10 bloques de texto en el primer panel de pila, y agregar Style="style2"
a todos los 10 en el segundo. Sin embargo, parece que debería haber alguna forma fácil de agregar un estilo al propio panel de distribución que de alguna manera le indique al panel de distribución que lo aplique a todos los elementos secundarios que son bloques de texto. ¿Hay alguna forma de hacer esto?
La razón por la que naturalmente busco esta solución es porque así es exactamente como haces el mismo tipo de cosas en HTML con CSS, y esperaba que hubiera una característica similar a XAML con el estilo.
¡Gracias!
PD: estoy trabajando con Silverlight, pero supongo que mi situación y cualquier solución (si hay una) se aplica a XAML / WPF en general.
En la sección de recursos para su contenedor principal, coloque su estilo con un atributo x:Key
y un tipo de objetivo de TextBlock
. Luego, en cada sección de recursos para cada StackPanel
puedes poner un estilo donde el atributo BasedOn
se establece en la clave de tu estilo principal (no olvides usar el enlace StaticResource, no solo el nombre de la tecla) y luego dice TargetType="{x:Type TextBlock}"
y termine la etiqueta. esto debería llevar el estilo al StackPanel y darle un estilo a todos tus 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>
Encontré una buena solución here . A continuación se muestra el código de muestra:
<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>
Espero que esto ayude.
Puede lograr esto anulando el estilo de bloque de texto predeterminado en los recursos de cada panel de pila:
<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>
<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>