2010-03-17 131 views
2

是否有一种简单的方法来设置WPF TabControl中所有非活动选项卡的背景画笔?我想在TabControl上模拟VS 2010的外观 - 控件的非活动标签的背景颜色应该与TabControl所在的窗口的背景颜色相匹配,以便您只能看到标签的文本,而不能标签本身。设置WPF TabControl非活动选项卡的背景颜色

我知道它需要一个ControlTemplate才能完成;我试图找出要放在控件模板中的内容。换句话说,如何指定一个特定的画刷应该应用于所有非活动选项卡?谢谢你的帮助。

回答

1

是的。定义画笔,然后根据你的风格选择标签,触发它的活动状态,当它处于活动状态时,将它设置为一个画笔,并在触发器因非活动状态而触发时将其设置为另一个画笔。

这可以完全在XAML中完成。

+0

谢谢 - 我对下面的答案进行了扩展,但是您会得到正确方向的选中标记。 –

5

以下是解决方案:正如Stephen所说,向控制模板添加一个触发器。它实际上是一个属性触发器,它只需要设置为非活动状态。所以我们设置触发器为IsSelected = false。我们将目标TabItem的边框(默认控制模板中的Bd)设置为TabItem,并将其Background设置为我们想要的颜色(我使用RelativeSource FindAncestor来匹配标签所在的网格)。然后我们设置BdBorderThickness为0,我们就大功告成了:

<Trigger Property="IsSelected" Value="false"> 
    <Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"/> 
    <Setter Property="BorderThickness" TargetName="Bd" Value="0" /> 
</Trigger> 

我把扳机的默认模板,略低于IsSelected =真触发。

请注意,该触发器是硬编码的,以搜索Grid祖先作为非活动选项卡背景颜色的来源(AncestorType={x:Type Grid})。这是因为我将我的视图背景设置为我用作布局根的Grid。如果您使用不同的布局根控件,或者在别处设置了视图背景颜色(例如在<Window>标记中),则需要更改AncestorType

顺便说一句,你还可以使用IsSelected =真触发到活动标签头的Background改变从白色,以匹配TabControl背景色:

<Trigger Property="IsSelected" Value="true"> 
    <Setter Property="Panel.ZIndex" Value="1"/> 
    <Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}}"/> 
</Trigger> 

对于那些谁喜欢这样的视觉表现,这里是完整的控制模板。它将自动应用于其范围内的任何TabControl。只需将此标记添加到XAML窗口的某个部分(或从ResourceDictionary导入它),并且您的TabControl将获得VS 2010外观。请记住更改FindAncestor proeprty,以便模板将找到正确的背景颜色。

<!-- Styles for FS TabItem Control Template--> 
<Style x:Key="TabItemFocusVisual"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="3,3,3,1" SnapsToDevicePixels="true"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<SolidColorBrush x:Key="TabControlNormalBorderBrush" Color="#8C8E94"/> 
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0"> 
    <GradientStop Color="#F3F3F3" Offset="0"/> 
    <GradientStop Color="#EBEBEB" Offset="0.5"/> 
    <GradientStop Color="#DDDDDD" Offset="0.5"/> 
    <GradientStop Color="#CDCDCD" Offset="1"/> 
</LinearGradientBrush> 
<LinearGradientBrush x:Key="TabItemHotBackground" EndPoint="0,1" StartPoint="0,0"> 
    <GradientStop Color="#EAF6FD" Offset="0.15"/> 
    <GradientStop Color="#D9F0FC" Offset=".5"/> 
    <GradientStop Color="#BEE6FD" Offset=".5"/> 
    <GradientStop Color="#A7D9F5" Offset="1"/> 
</LinearGradientBrush> 
<SolidColorBrush x:Key="TabItemSelectedBackground" Color="#F9F9F9"/> 
<SolidColorBrush x:Key="TabItemHotBorderBrush" Color="#3C7FB1"/> 
<SolidColorBrush x:Key="TabItemDisabledBackground" Color="#F4F4F4"/> 
<SolidColorBrush x:Key="TabItemDisabledBorderBrush" Color="#FFC9C7BA"/> 

<!-- FS TabItem Control Template--> 
<Style TargetType="{x:Type TabItem}"> 
    <Setter Property="FocusVisualStyle" Value="{StaticResource TabItemFocusVisual}"/> 
    <Setter Property="Foreground" Value="Black"/> 
    <Setter Property="Padding" Value="6,1,6,1"/> 
    <Setter Property="BorderBrush" Value="{StaticResource TabControlNormalBorderBrush}"/> 
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Grid SnapsToDevicePixels="true"> 
        <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Padding="{TemplateBinding Padding}"> 
         <ContentPresenter x:Name="Content" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"/> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemHotBackground}"/> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter Property="Panel.ZIndex" Value="1"/> 
         <Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}}"/> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="false"> 
         <Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"/> 
         <Setter Property="BorderThickness" TargetName="Bd" Value="0" /> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="false"/> 
          <Condition Property="IsMouseOver" Value="true"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource TabItemHotBorderBrush}"/> 
        </MultiTrigger> 
        <Trigger Property="TabStripPlacement" Value="Bottom"> 
         <Setter Property="BorderThickness" TargetName="Bd" Value="1,0,1,1"/> 
        </Trigger> 
        <Trigger Property="TabStripPlacement" Value="Left"> 
         <Setter Property="BorderThickness" TargetName="Bd" Value="1,1,0,1"/> 
        </Trigger> 
        <Trigger Property="TabStripPlacement" Value="Right"> 
         <Setter Property="BorderThickness" TargetName="Bd" Value="0,1,1,1"/> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="true"/> 
          <Condition Property="TabStripPlacement" Value="Top"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Margin" Value="-2,-2,-2,-1"/> 
         <Setter Property="Margin" TargetName="Content" Value="0,0,0,1"/> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="true"/> 
          <Condition Property="TabStripPlacement" Value="Bottom"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Margin" Value="-2,-1,-2,-2"/> 
         <Setter Property="Margin" TargetName="Content" Value="0,1,0,0"/> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="true"/> 
          <Condition Property="TabStripPlacement" Value="Left"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Margin" Value="-2,-2,-1,-2"/> 
         <Setter Property="Margin" TargetName="Content" Value="0,0,1,0"/> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsSelected" Value="true"/> 
          <Condition Property="TabStripPlacement" Value="Right"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Margin" Value="-1,-2,-2,-2"/> 
         <Setter Property="Margin" TargetName="Content" Value="1,0,0,0"/> 
        </MultiTrigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemDisabledBackground}"/> 
         <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource TabItemDisabledBorderBrush}"/> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>