如何以编程方式从后面的代码更改选定的 tabItem Header 颜色
How to programmatically change selected tabItem Header colour from code behind
我有一个程序,我必须在启动时加载颜色。
然后我必须添加一个带有选项卡项的选项卡控件:
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 事件时更改背景,但这不起作用。
您必须将 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。
顺便说一句:您的代码甚至无法编译,因为 Header
属于 object
...
类型
您可以使用文本块来更改颜色:
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();
};
编辑你最好取消突出显示未选择的项目:
tabc.SelectionChanged += (sender2, args) =>
{
foreach (var item in tabc.Items)
{
if (item == ((TabItem)(tabc.SelectedItem)))
((TabItem)item).Foreground = Brushes.Red;
else
((TabItem)item).Foreground = Brushes.Black;
}
};
TabItem 的默认控件模板包含两个名为 "mainBorder" 的 Border 元素和一个 "innerBorder"。您可以更改后一个的背景:
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
的背景 属性。
我有一个程序,我必须在启动时加载颜色。 然后我必须添加一个带有选项卡项的选项卡控件:
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 事件时更改背景,但这不起作用。
您必须将 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。
顺便说一句:您的代码甚至无法编译,因为 Header
属于 object
...
您可以使用文本块来更改颜色:
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();
};
编辑你最好取消突出显示未选择的项目:
tabc.SelectionChanged += (sender2, args) =>
{
foreach (var item in tabc.Items)
{
if (item == ((TabItem)(tabc.SelectedItem)))
((TabItem)item).Foreground = Brushes.Red;
else
((TabItem)item).Foreground = Brushes.Black;
}
};
TabItem 的默认控件模板包含两个名为 "mainBorder" 的 Border 元素和一个 "innerBorder"。您可以更改后一个的背景:
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
的背景 属性。