2012-02-25 12 views
5

C'è un modo per applicare gli stili al primo (o ultimo o ennesimo) figlio di un contenitore (qualsiasi cosa contenga figli)? Sto cercando di personalizzare l'aspetto degli elementi della scheda in modo che il primo abbia un raggio di confine diverso dagli altri.Applicare lo stile al primo figlio?

Questo è quello che ho adesso:

<ControlTemplate TargetType="{x:Type TabItem}"> 
    <Grid> 
     <Border Name="Border" BorderBrush="#666" BorderThickness="1,1,1,0" CornerRadius="8,8,0,0" Margin="0,0,0,-1"> 
      <TextBlock x:Name="TabItemText" Foreground="#444" Padding="6 2" TextOptions.TextFormattingMode="Display"> 
       <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="12,2,12,2"/> 
      </TextBlock> 
     </Border> 
    </Grid> 
</ControlTemplate> 

risposta

6

Per le classi di ItemsControl derivate (come TabControl), è possibile utilizzare la proprietà ItemContainerStyleSelector dipendenza. Quando viene impostata questa proprietà di dipendenza, ItemsControl chiamerà StyleSelector.SelectStyle() per ciascun elemento nel controllo. Questo ti permetterà di usare stili diversi per oggetti diversi.

L'esempio seguente modifica l'ultimo elemento della scheda in un oggetto TabControl in modo che il suo testo sia in grassetto e leggermente più grande rispetto alle altre schede.

In primo luogo, la nuova classe StyleSelector:

selettore
class LastItemStyleSelector : StyleSelector 
{ 
    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     var itemsControl = ItemsControl.ItemsControlFromItemContainer(container); 
     var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container); 

     if (index == itemsControl.Items.Count - 1) 
     { 
      return (Style)itemsControl.FindResource("LastItemStyle"); 
     } 

     return base.SelectStyle(item, container); 
    } 
} 

Questo stile tornerà lo stile con il tasto "LastItemStyle", ma solo per l'ultimo elemento nel controllo. Gli altri elementi useranno lo stile predefinito. (Si noti che questa funzione utilizza solo membri di ItemsControl e potrebbe essere utilizzata anche per altre classi derivate da ItemsControl.) Successivamente, nel proprio XAML, è necessario prima creare due risorse. La prima risorsa sarà per questo LastItemStyleSelector e la seconda risorsa per lo stile.

<Window.Resources> 
    <local:LastItemStyleSelector x:Key="LastItemStyleSelector" /> 

    <Style x:Key="LastItemStyle" TargetType="TabItem"> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="FontSize" Value="16" /> 
    </Style> 
</Window.Resources> 

Poi finalmente il tuo TabControl:

<TabControl ItemContainerStyleSelector="{StaticResource LastItemStyleSelector}"> 
     <TabItem Header="First" /> 
     <TabItem Header="Second" /> 
     <TabItem Header="Third" /> 
    </TabControl> 

Per ulteriori informazioni consultare la documentazione di MSDN:

+0

Questo non funzionerà per il contenuto dinamico come @rFactor apparentemente ha bisogno, in quanto gli ItemContainer non vengono ricreati quando viene aggiunta una nuova scheda. Quindi, aggiungi una "nuova" scheda alla fine e anche a quest'ultima verrà assegnato "LastItemStyle". – WiredPrairie

1

A differenza di HTML e CSS, non c'è un modo semplice per determinare e innescare quel tipo di cambiamento.

Potresti potenzialmente scrivere un trigger e utilizzare un convertitore di valori per fare qualcosa del genere usando this forum post come ispirazione potenzialmente.

Molto più semplice sarebbe applicare uno stile personalizzato al tabitem che si desidera apparire diverso. Hai provato?

<TabItem Header="TabItem" Style="{DynamicResource FirstTabStyle}"> 
    <Grid Background="#FFE5E5E5"/> 
</TabItem> 
+0

La cosa è che t gli addominali vengono riordinati, rimossi e aggiunti in qualsiasi momento. Quindi avrei bisogno di aggiungere anche quegli stili (e rimuovere). – Tower

+0

OK: la tua domanda non ha specificato tale requisito. :) – WiredPrairie

Problemi correlati