如何通过TabControl模板控制Textblock属性

时间:2016-08-27 04:32:23

标签: wpf xaml wpf-controls tabcontrol

我设置了一个TabControl,其中包含用于保存图片的自定义网格和一个Textblock对象作为标题的设计(TabItem)。我目前正在使用模板控制标题的背景颜色,我无法弄清楚如何使用相同的模板控制嵌入式Foreground的{​​{1}}颜色。

我是Visual Studio C#的新手,但我对这些模板的理解是我可以使用它们设置子属性(类似于CSS子选择器)?还是我完全离开?

这是我的设计" - 您会注意到顶部的三个标签带有自定义样式: Design with three tabs on top

TextBlock的当前模板

TabItem

我目前为<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabItem}"> <Grid x:Name="Root"> <Border x:Name="Border" Margin="0,0,-4,0"> <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="12,2,12,2" RecognizesAccessKey="True" /> </Border> </Grid> <ControlTemplate.Triggers> <!-- Selected color --> <Trigger Property="IsSelected" Value="True"> <!-- <Setter Property="TextElement.Foreground" TargetName="ContentSite" Value="White"/>--> <Setter Property="Panel.ZIndex" Value="100" /> <Setter TargetName="Border" Property="Background" Value="#FFEF690D" /> </Trigger> <!-- Not Selected color --> <Trigger Property="IsSelected" Value="False"> <Setter TargetName="Border" Property="Background" Value="#FFEE8740" /> </Trigger> <!-- Tab mouseovers--> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True"/> <Condition Property="IsSelected" Value="False"/> </MultiTrigger.Conditions> <Setter TargetName="Border" Property="Background" Value="#FFEFA470" /> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> 设置的xaml(为了简洁,减少了第三个TabControl

TabItem

2 个答案:

答案 0 :(得分:0)

我建议使用LinqToVisualTree ...

http://blog.scottlogic.com/2010/03/04/linq-to-visual-tree.html

您可以在TabControl中找到所有“textBlock”控件,如下所示:

tabControl.Descendants<TextBlock>().Where(d => d.Name=="textBlock");

然后您将控制TextBlock属性

答案 1 :(得分:0)

对于任何想要完成相同类型任务的人来说,有一种方法可以引用父资源和&#34;查询&#34;他们的信息。

我没有在TabItem上设置触发器来更改字体的颜色,而是将触发器放在引用TextBlock状态的TabItem上。

您最终使用DataTrigger并使用RelativeSource设置对其进行绑定。在我的情况下,我使用TabItem

将其绑定到{RelativeSource AncestorType={x:Type TabItem}}}

这是我应用于TextBlock控件的XAML样式:

<Style x:Key="HeaderTextStyle" TargetType="{x:Type TextBlock}">
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Setter Property="TextTrimming" Value="None"/>
    <Setter Property="Foreground" Value="{StaticResource HeaderTextColor_NotSelected}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" Value="true">
            <Setter Property="Foreground" Value="{StaticResource HeaderTextColor}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>