我是C#和WPF的新手,所以如果有愚蠢的问题,请原谅:-)。,我想动态地从后面的代码中更改所选的选项卡颜色属性。我已经找到了很少的解决方案,但只针对静态的颜色变化。完成非选定选项卡的动态颜色更改。请参阅代码:
XAML:
<TabControl x:Name="tabSections" Margin="0,400,0,20" Width="1348" BorderBrush="{x:Null}" FontSize="16" FontWeight="Bold" Visibility="Visible" TabStripPlacement="Top" Cursor="Hand" SelectionChanged="tabSections_SelectionChanged">
<TabControl.Background>
<SolidColorBrush Color="#FF464646" Opacity="1"/>
</TabControl.Background>
<TabItem x:Name="tabSect1" Width="168" Height="30" Header="Section 1">
</TabItem>
<TabItem x:Name="tabSect2" Width="168" Height="30" Header="Section 2">
</TabItem>
<TabItem x:Name="tabSect3" Width="168" Height="30" Header="Section 3">
</TabItem>
<TabItem x:Name="tabSect4" Width="168" Height="30" Header="Section 4">
</TabItem>
<TabItem x:Name="tabSect5" Width="168" Height="30" Header="Section 5">
</TabItem>
<TabItem x:Name="tabSect6" Width="168" Height="30" Header="Section 6">
</TabItem>
<TabItem x:Name="tabSect7" Width="168" Height="30" Header="Section 7">
</TabItem>
<TabItem x:Name="tabSect8" Width="168" Height="30" Header="Section 8">
</TabItem>
</TabControl>
C#:
for (int i = 0; i < SectionCount; i++)
{
if (TabsColors[i])
{
TabBrushes[i] = Brushes.Orange;
}
else
{
TabBrushes[i] = Brushes.LightGreen;
}
}
for (int j = SectionCount; j < 8; j++)
{
TabBrushes[j] = Brushes.DarkGray;
}
tabSect1.Background = TabBrushes[0];
tabSect2.Background = TabBrushes[1];
tabSect3.Background = TabBrushes[2];
tabSect4.Background = TabBrushes[3];
tabSect5.Background = TabBrushes[4];
tabSect6.Background = TabBrushes[5];
tabSect7.Background = TabBrushes[6];
tabSect8.Background = TabBrushes[7];
谢谢你提前帮忙。祝您今天愉快。
发布于 2022-01-10 16:30:30
通过引用Selector
控件的SelectedItem
属性,始终可以获取其选定的项。
要使用Style
,只需将Brush
引用为动态资源,并将其更改为代码隐藏:
MainWindow.xaml
<Window>
<Window.Resources>
<SolidColorBrush x:Key="SelectedItemBackgroundBrush"
Color="Red" />
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Border x:Name="Border"
Margin="0,0,-4,0"
CornerRadius="2,12,0,0"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter x:Name="ContentSite"
VerticalAlignment="Center"
HorizontalAlignment="Center"
ContentSource="Header"
Margin="12,2,12,2"
RecognizesAccessKey="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Background"
Value="LightGray" />
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Panel.ZIndex"
Value="100" />
<Setter Property="Background"
Value="{DynamicResource SelectedItemBackgroundBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
</Window>
MainWindow.xaml.cs
this.Resources["SelectedItemBackgroundBrush"] = Brushes.GreenYellow;
当您需要访问集合的每个元素时,您不应该显式地访问它。相反,您会在集合中迭代:
for (int tabItemIndex = 0; tabItemIndex < this.tabSections.Items.Count; tabItemindex++)
{
var tabItem = this.tabSections.Items[tabItemIndex] as TabItem;
tabItem.Background = tabItem.IsSelected
? Brushes.Red
: this.TabBrushes[tabItemIndex];
}
// Alternative way to change the color of the selected item
var selectedTabItem = this.tabSections.SelectedItem as TabItem;
selectedTabItem.Background = this.TabBrushes[tabItemIndex];
发布于 2022-01-13 05:37:31
首先,我要感谢您@BionicCode的帮助。
我从一开始就犯的错误是XAML中的触发器声明顺序。
下面的示例首先声明所选选项卡属性,然后声明覆盖的已启用选项卡属性,因此所选属性没有机会被看到。
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Value="LightGray" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="border" Property="Background" Value="{DynamicResource SelectedItemBackgroundBrush}" />
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="16"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="#FF464646" />
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="FontWeight" Value="UltraLight"/>
</Trigger>
<Trigger Property="IsEnabled" Value="True">
<Setter TargetName="border" Property="Background" Value="{DynamicResource EnabledItemBackgroundBrush}" />
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontWeight" Value="UltraLight"/>
</Trigger>
</ControlTemplate.Triggers>
正确的顺序是(选中的属性在启用属性之后):
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Value="LightGray" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="#FF464646" />
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="FontWeight" Value="UltraLight"/>
</Trigger>
<Trigger Property="IsEnabled" Value="True">
<Setter TargetName="border" Property="Background" Value="{DynamicResource EnabledItemBackgroundBrush}" />
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontWeight" Value="UltraLight"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="border" Property="Background" Value="{DynamicResource SelectedItemBackgroundBrush}" />
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="16"/>
</Trigger>
</ControlTemplate.Triggers>
祝你今天愉快!
https://stackoverflow.com/questions/70654020
复制相似问题