2012-02-25 4 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의 마지막 탭 항목을 변경하여 텍스트가 굵게 표시되고 다른 탭보다 약간 크게 표시되도록합니다.

첫째, 새로운 스타일 선택기 클래스 :

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에서 먼저 두 개의 리소스를 만들어야합니다. 첫 번째 리소스는이 LastItemStyleSelector에 있고 두 번째 리소스는 스타일입니다.

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

+0

새 탭을 추가 할 때 ItemContainers가 다시 만들어지지 않기 때문에 이것은 @rFactor가 필요로하는 동적 내용에는 작동하지 않습니다. 마지막에 "새"탭을 추가하면 "LastItemStyle"이 지정됩니다. – WiredPrairie

1

결정과 변화의 유형을 실행할 수있는 간단한 방법이 아니다 :

이 내가 지금 가지고있는 것입니다.

잠재적으로 잠재적 인 아이디어로 this forum post을 사용하는 것과 같은 것을하기 위해 트리거를 작성하고 값 변환기를 사용할 수 있습니다.

훨씬 더 간단하게 보이게하려는 사용자 정의 스타일을 tabitem에 적용하는 것이 더 간단 할 것입니다. 너 그거 해봤 니?

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

는 것은 그 t이다 : 자세한 내용은

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

은 MSDN 설명서를 참조하십시오 복근은 언제든지 재 배열, 제거 및 추가됩니다. 그래서 나는 그 스타일을 추가하고 제거해야 할 것입니다. – Tower

+0

OK - 귀하의 질문에 해당 요구 사항이 명시되어 있지 않습니다. :) – WiredPrairie

관련 문제