2011-02-02 14 views
35

Diciamo che ho due pannelli dello stack distinti (li chiameremo SPA e SPB), ciascuno con 10 blocchi di testo come elementi figlio. Tutti i blocchi di testo in SPA dovrebbero utilizzare uno stile e tutti i blocchi di testo in SPB dovrebbero utilizzarne un altro. Un modo per ottenere ciò sarebbe dichiarare i due stili in Risorse, quindi aggiungere Style="style1" a tutti i 10 blocchi di testo nel primo pannello dello stack e aggiungere Style="style2" a tutti e 10 nel secondo. Tuttavia, sembra che ci dovrebbe essere un modo semplice per aggiungere uno stile allo stackpanel stesso che in qualche modo dice allo stackpanel di applicarlo a tutti gli elementi figlio che sono textblocks. C'è un modo per fare questo?Impostare lo stile per tutti i blocchi di testo in un pannello dello stack

Il motivo per cui naturalmente cerco questa soluzione è perché questo è esattamente come si fa lo stesso genere di cose in HTML con i CSS, e speravo che ci sarebbe stata una funzionalità simile a XAML con lo stile.

Grazie!

P.S. Sto lavorando con Silverlight, ma sto indovinando la mia situazione e qualunque soluzione (se ce n'è una) si applica a XAML/WPF in generale.

+0

"sto cercando di indovinare la mia situazione e qualsiasi soluzione (se ce n'è uno) si applica a XAML/WPF in generale. " E come ha funzionato per te nel corso degli anni? :) –

risposta

54

Nella sezione delle risorse del contenitore principale inserisci il tuo stile con un attributo x:Key e un tipo di target TextBlock. Quindi in ciascuna sezione delle risorse per ogni StackPanel è possibile inserire uno stile in cui l'attributo BasedOn è impostato sulla chiave dello stile principale (non dimenticare di utilizzare il binding StaticResource, non solo il nome della chiave) e quindi dire TargetType="{x:Type TextBlock}" e terminare il tag. questo dovrebbe portare lo stile nello StackPanel e stile tutti i tuoi 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> 
+0

Bello! La cosa che mi piace della tua soluzione è che raggiunge il mio obiettivo mantenendo gli stili ingombranti dalle singole sezioni di risorse, il che consente anche di utilizzarli altrove al di fuori di quel singolo pannello di stack. Grazie! – JoeCool

+0

Ho appena scoperto BasedOn la scorsa settimana mentre lavoravo su un problema simile. Puoi persino inserire lo stile in un ResourceDictionary e utilizzarlo nello stesso modo finché lo includi nelle risorse della tua finestra. –

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

È possibile raggiungere questo obiettivo l'override stile testo blocco di default nelle risorse di ogni pannello 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> 
Problemi correlati