[英]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 事件時改變背景,但這不起作用。
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
。
您可以使用文本塊來更改顏色:
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;
}
};
您必須將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
類型...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.