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

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

这就是我现在拥有的:

         

对于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,第二个资源是样式。

     

最后你的TabControl:

       

有关更多信息,请参阅MSDN文档:

  • ItemsControl.ItemContainerStyleSelector属性
  • StyleSelector类

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

你可能会写一个触发器并使用值转换器来做这样的事情,使用这个论坛post作为潜在的灵感。

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