c# - 将样式应用于第一个 child ?

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

最佳答案

对于 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 文档:

关于c# - 将样式应用于第一个 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9444536/

相关文章:

C# using 子句 - 说明

c# - 正则表达式删除特定字符串(如果存在)

c# - 从程序集中获取所有资源的列表

c# - 如何以编程方式触发 WinRT/C#/XAML 中的按键事件?

c# - 如何检测到达 ScrollViewer 项目的末尾 (Windows 8)?

c# - 当包含在其他控件中时换行面板不换行

c# - 如何更改 ClickOnce 中先决条件的下载和安装顺序

wpf - 如何在 XAML 中将列表框从 0 增大到网格的大小

c# - WPF DataTemplate 方法与参数绑定(bind)

c# - XAML 中框架的 System.InvalidCastException