2012-02-25 17 views
5

コンテナの最初の(または最後かn番目の)子(子を含むもの)にスタイルを適用する方法はありますか?私は最初のものが他のものより異なるボーダー半径を持つようにタブ項目の外観をカスタマイズしようとしています。最初の子供にスタイルを適用しますか?

これは私が今持っているものです:HTMLとCSSとは異なり

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

答えて

6

ItemsControl派生クラス(TabControlなど)では、ItemContainerStyleSelector依存プロパティを使用できます。この依存関係プロパティが設定されると、ItemsControlはコントロールの各項目に対してStyleSelector.SelectStyle()を呼び出します。これにより、異なるアイテムに対して異なるスタイルを使用することができます。

次の例では、TabControlの最後のタブ項目を太字にし、他のタブよりも少し大きくなるように変更します。

まず、新しいStyleSelectorクラス:

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); 
    } 
} 

このスタイル選択キー「LastItemStyle」だけコントロール内の最後のアイテムのためにスタイルを返します。他のアイテムはデフォルトスタイルを使用します。 (この関数はItemsControlのメンバーのみを使用し、他のItemsControlの派生クラスにも使用できます)。次に、XAMLで、まず2つのリソースを作成する必要があります。最初のリソースはこのLastItemStyleSelectorになり、2番目のリソースはスタイルになります。

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

は、その後最終的にあなたのTabControl:詳細については

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

は、MSDNのドキュメントを参照してください。

+0

新しいタブが追加されたときにItemContainerが再作成されないので、これは明らかに@ rFactorが必要とするように、動的コンテンツに対しては機能しません。したがって、最後に「新しい」タブを追加し、それにも「LastItemStyle」が割り当てられます。 – WiredPrairie

1

、変更の種類を決定し、トリガするための簡単な方法はありません。

潜在的に誘因としてthis forum postを使用するようなものを実行するために、トリガを書き込み、値コンバータを使用することができます。

もっと見た目がよくなるように、カスタムスタイルをタブアイテムに適用するほうがずっと簡単です。あなたはそれを試しましたか?

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

事はそのトンでありますabsは並べ替えられ、削除され、いつでも追加されます。だから私はそれらのスタイルを追加する(と削除する)必要があります。 – Tower

+0

OK - あなたの質問にはその要件が記載されていません。 :) – WiredPrairie

関連する問題