适用于第一个孩子的风格?

时间:2012-02-25 13:48:40

标签: c# wpf xaml

是否有某种方法可以将样式应用于容器的第一个(或最后一个或第n个)子项(包含子项的任何内容)?我正在尝试自定义选项卡项的外观,以便第一个选项卡的边框半径与其他项不同。

这就是我现在所拥有的:

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

2 个答案:

答案 0 :(得分: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中,首先需要创建两个资源。第一个资源是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:

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

有关详细信息,请参阅MSDN文档:

答案 1 :(得分:1)

与HTML和CSS不同,没有一种简单的方法可以确定和触发这种类型的更改。

您可能会使用this forum post作为灵感来编写触发器并使用值转换器来执行此类操作。

更简单的方法是将自定义样式应用于您希望看起来不同的tabitem。你试过了吗?

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