如何以编程方式从后面的代码更改选定的tabItem标头颜色

时间:2017-01-10 12:39:03

标签: c# wpf tabcontrol

我有一个程序,我必须在启动时加载颜色。 然后我必须添加一个带有标签项的tabcontrol:

TabControl tabc = m_Executer.GetTabControl();<---- from outside
if (tabc != null)
{
    TabItem tbi = new TabItem();
    tbi.Header.Background = Brushes.Transparent;
    tbi.Header.Content = "End manager";
    tabc.Items.Add(tbi);
    tabc.SelectionChanged += (sender2, args) =>
    {
        ((TabItem)(tabc.SelectedItem)).Background = Brushes.Red;
        tabc.UpdateLayout();
    };
}

这个想法是在触发selectionchanged事件时更改背景,但这不起作用。

3 个答案:

答案 0 :(得分:2)

TabItem的默认控件模板包含两个名为“mainBorder”和“innerBorder”的Border元素。你可以改变后者的背景:

tabc.SelectionChanged += (sender2, args) =>
{
    if(args.AddedItems != null && args.AddedItems.Count > 0)
    {
        TabItem ti = args.AddedItems[0] as TabItem;
        if(ti != null && VisualTreeHelper.GetChildrenCount(ti) > 0)
        {
            Grid grid = VisualTreeHelper.GetChild(ti, 0) as Grid;
            if (grid != null)
            {
                Border mainBorder = grid.Children[0] as Border;
                if (mainBorder != null)
                {
                    Border innerBorder = mainBorder.Child as Border;
                    if(innerBorder != null)
                        innerBorder.Background = Brushes.Red;
                }
            }
       }
   }
};

上述代码适用于Windows 10.不同版本的Windows之间的模板可能有所不同。

如果您想更改未选中的TabItem的背景,只需将AddedItems替换为RemovedItems,然后设置mainBorder的背景属性。

答案 1 :(得分:1)

您可以使用文本块来更改颜色:

bool alreadyBooked = bookings.Any(booking.IntersectsWith);

然后更改事件

上的文本块
TabItem tbi = new TabItem();
tbi.Header = Brushes.Transparent;
TextBlock tbk = new TextBlock() { Text="End manager" };
tbi.Header = tbk;
    tabc.Items.Add(tbi);

编辑你最好不要突出显示未选择的项目:

tabc.SelectionChanged += (sender2, args) =>
{

    ((TabItem)(tabc.SelectedItem)).Foreground = Brushes.Red;
    tabc.UpdateLayout();

};

答案 2 :(得分:0)

您必须将Content设置为TextBlock而不是字符串:

<强> XAML:

<TabControl>
    <TabControl.Items>
        <TabItem >
            <TabItem.Header>
                <TextBlock Background="Red" Text="Foo"/>
            </TabItem.Header>
        </TabItem>
        <TabItem Header="Bar" />
    </TabControl.Items>
</TabControl>

或代码背后(无论出于何种原因......)

TabItem tbi = new TabItem();
TextBlock headerElement = new TextBlock();
headerElement.Text = "End manager";
headerElement.Background = Brushes.Red;
tbi.Header = headerElement;

我还建议你深入研究MVVM模式。在98%的情况下,最佳做法是在XAML中编写UI并绑定到ViewModel。

BTW:您的代码甚至无法编译,因为Header的类型为object ...