Tabitem模板获取displayindex?

时间:2015-04-19 16:14:34

标签: c# wpf

我想为我的tabitems创建一个具有以下属性的样式: - 第一个tabitem将在左角设置角半径 - 最后一个tabitem将在右角设置角半径

预期结果:enter image description here

问题1: 所以我需要能够获得模板中当前tabitem的索引(以及tabcontrol中的tabitems数量。

我希望能够以一种风格做到这一点。我目前正在使用3个样式(一个用于第一个,一个用于最后一个,一个用于其他)但在我的应用程序中我经常需要隐藏一个或两个tabitems所以我需要检查是否必须设置一个新的代码中的样式并不真正有用。

问题2:我想在当前所选的tabitem之前更改所有tabitems的样式。

这只能使用一种风格吗?

谢谢

1 个答案:

答案 0 :(得分:2)

3个样式部分没问题,你缺少的是StyleSelector,它将根据ItemIndex选择样式

public class TabItemStyleSelector : StyleSelector
    {
        public override Style SelectStyle(object item, DependencyObject container)
        {
            var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
            var itemIndex = itemsControl.ItemContainerGenerator.IndexFromContainer(container);

            //first index
            if(itemIndex == 0)
            {
                return (Style)itemsControl.FindResource("FirstTabItemItemStyle");
            }
            //last index
            if (itemIndex == itemsControl.Items.Count - 1)
            {
                return (Style)itemsControl.FindResource("LastTabItemItemStyle");
            }

            //other indecies
            return (Style)itemsControl.FindResource("OtherTabItemItemStyle");

            //return base.SelectStyle(item, container); return this if OtherTabItemItemStyle does not exist
        }
    }

将其添加到您的资源

<Window.Resources>
        <local:TabItemStyleSelector x:Key="TabItemStyleSelector" />
 </Window.Resources>

并在TabControl中将其用作:

 <TabControl ItemsSource="{Binding Items}" ItemContainerStyleSelector="{StaticResource TabItemStyleSelector}">
</TabControl>

请注意,上面的选择器适用于任何ItemsControl而不只是TabControl

相关问题