2009-07-02 2 views
3

탭이 활성화 될 때마다 TabItem 텍스트의 전경을 변경하려고합니다. 난 콘텐츠의 유형이 탭에 표시되고 변경 될 때까지 잘 작동 한 다음 사용하던 : 없음중첩 된 텍스트로 WPF TabItem의 텍스트 전경을 어떻게 변경합니까?

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabItem Style="{DynamicResource SidebarTab}"> 
     <TabItem.Header> 
      <StackPanel Orientation="Horizontal"> 
       <Image Height="16" Source="..\..\Icons\cog.png" /> 
       <TextBlock Text="TabItem" Margin="5,0,0,0" VerticalAlignment="Center" /> 
      </StackPanel> 
     </TabItem.Header> 
    </TabItem> 
</TabControl> 

텍스트의 전경을 : 나는에 TabItem의 변경

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabItem Header="TabItem" Style="{DynamicResource SidebarTab}" /> 
</TabControl> 

<Style x:Key="SidebarTabForegroundStyleSelected"> 
    <Setter Property="TextBlock.Foreground" Value="White" /> 
</Style> 

<Style x:Key="SidebarTabForegroundStyle"> 
    <Setter Property="TextBlock.Foreground" Value="Black" /> 
</Style> 

<Style x:Key="SidebarTab" TargetType="TabItem"> 
    <Setter Property="Padding" Value="10,12,2,12" /> 
    <Setter Property="BorderThickness" Value="0,1,0,1" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Border Padding="{TemplateBinding Padding}" 
        Name="tab" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        BorderBrush="{StaticResource SidebarTabBorderBrush}" 
        SnapsToDevicePixels="True"> 
        <ContentPresenter Style="{StaticResource SidebarTabForegroundStyle}" Name="content" ContentSource="Header" /> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" /> 
         <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" /> 
         <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyleSelected}" /> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="False"> 
         <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" /> 
         <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" /> 
         <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyle}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

탭을 선택하면 더 이상 흰색으로 변하고 더 이상 탭을 선택하지 않으면 검은 색으로 바뀝니다. 다른 모든 것은 여전히 ​​올바르게 작동합니다.

위의 XAML에서 전경색을 변경하는 방법이 있는지 알고 있습니까?

<Style x:Key="SidebarTabForegroundStyleSelected"> 
    <Setter Property="TextBox.Foreground" Value="White" /> 
</Style> 

<Style x:Key="SidebarTabForegroundStyle"> 
    <Setter Property="TextBox.Foreground" Value="Black" /> 
</Style> 

당신은 TextBlock.Foreground

또한 TextElement.Foreground 또는 설정 될 필요가 있기 때문에, : 잘못된 속성을 설정하고 있기 때문에

그것은 문제처럼 보인다
+0

가 된 ContentPresenter에 스타일을 제거, 그것은 당신의 트리거를 무시 것 : http://msdn.microsoft.com/en-us/ library/ms743230.aspx – rmoore

+0

감사합니다. 귀하의 질문은 제가 물어볼 때와 비슷한 질문에 대한 대답을 도왔습니다. – IbrarMumtaz

답변

4
이 스타일로 컨트롤 템플릿에서 트리거를 이동

:

<Grid> 
    <Grid.Resources> 
     <SolidColorBrush x:Key="SidebarTabBackgroundBrushSelected" Color="Gray"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBorderBrushSelected" Color="Blue"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBackgroundBrush" Color="LightGray"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBorderBrush" Color="Green"></SolidColorBrush> 

     <Style x:Key="SidebarTab" TargetType="TabItem"> 
      <Setter Property="Padding" Value="10,12,2,12" /> 
      <Setter Property="BorderThickness" Value="0,1,0,1" /> 
      <Setter Property="Foreground" Value="Blue"></Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabItem}"> 
         <Border Padding="{TemplateBinding Padding}" 
       Name="tab" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       BorderBrush="{StaticResource SidebarTabBorderBrush}" 
       SnapsToDevicePixels="True"> 
          <ContentPresenter Name="content" 
               ContentSource="Header" /> 
         </Border> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" /> 
           <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" /> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="False"> 
           <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" /> 
           <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Foreground" Value="Red"></Setter> 
       </Trigger> 
       </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <TabControl Style="{DynamicResource SidebarTabControl}"> 
     <TabItem Header="TabItem 1" Style="{DynamicResource SidebarTab}" /> 
     <TabItem Style="{DynamicResource SidebarTab}" > 
      <TabItem.Header> 
       <StackPanel> 
        <TextBlock Text="a"></TextBlock> 
        <TextBlock Text="b"></TextBlock> 
       </StackPanel> 
      </TabItem.Header> 
     </TabItem> 
     <TabItem Header="TabItem 3" Style="{DynamicResource SidebarTab}" /> 
    </TabControl> 
</Grid> 
+0

도움을 주셔서 감사합니다. –

0

이 다가오고 이 속성은 상속 된 속성이므로 AttachedProperty를 TabItems에 직접 설정할 수 있습니다. 콘텐츠에 구체적으로 지정할 필요가 없습니다.

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" 
         Value="True"> 
        <Setter Property="TextElement.Foreground" 
          Value="Red" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TabControl.ItemContainerStyle> 
    <TabItem> 
     <TabItem.Header> 
      <StackPanel Orientation="Horizontal"> 
       <Image Height="16" 
         Source="..\..\Icons\cog.png" /> 
       <TextBlock Text="TabItem" 
          Margin="5,0,0,0" 
          VerticalAlignment="Center" /> 
      </StackPanel> 
     </TabItem.Header> 
     Item 1 
    </TabItem> 
    <TabItem> 
     <TabItem.Header> 
      <TextBlock Text="Tab 2" /> 
     </TabItem.Header> 
     Item 2 
    </TabItem> 
    <TabItem Header="Item 3"> 
     Item 3 
    </TabItem> 
</TabControl> 
+0

아내, 내 부분에 오타가 있습니다. TextBlock.Foreground가 있어야합니다. 나는 당신이 제안한 것을 시도해 보았고, StackPanel 텍스트로 원하는 결과를 얻지 못했다. StackPanel 텍스트는 활성화되었을 때 White (또는 예제에서는 빨간색)가되어야한다. –

+1

컨트롤 템플릿에서 업데이트하려고하면 스타일을 제거해야합니다. 직접 설정되는 스타일입니다. 컨텐트 발표자는 제어 템플릿의 트리거보다 우선 순위가 높습니다. http://msdn.microsoft.com/en-us/library/ms743230.aspx – rmoore

관련 문제