首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF TabControl所选项目颜色从回码中更改

WPF TabControl所选项目颜色从回码中更改
EN

Stack Overflow用户
提问于 2022-01-10 14:31:08
回答 2查看 351关注 0票数 0

我是C#和WPF的新手,所以如果有愚蠢的问题,请原谅:-)。,我想动态地从后面的代码中更改所选的选项卡颜色属性。我已经找到了很少的解决方案,但只针对静态的颜色变化。完成非选定选项卡的动态颜色更改。请参阅代码:

XAML:

代码语言:javascript
运行
复制
<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#:

代码语言:javascript
运行
复制
  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];

谢谢你提前帮忙。祝您今天愉快。

EN

回答 2

Stack Overflow用户

发布于 2022-01-10 16:30:30

通过引用Selector控件的SelectedItem属性,始终可以获取其选定的项。

要使用Style,只需将Brush引用为动态资源,并将其更改为代码隐藏:

MainWindow.xaml

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
this.Resources["SelectedItemBackgroundBrush"] = Brushes.GreenYellow;

当您需要访问集合的每个元素时,您不应该显式地访问它。相反,您会在集合中迭代:

代码语言:javascript
运行
复制
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];
票数 0
EN

Stack Overflow用户

发布于 2022-01-13 05:37:31

首先,我要感谢您@BionicCode的帮助。

我从一开始就犯的错误是XAML中的触发器声明顺序。

下面的示例首先声明所选选项卡属性,然后声明覆盖的已启用选项卡属性,因此所选属性没有机会被看到。

代码语言:javascript
运行
复制
<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>

正确的顺序是(选中的属性在启用属性之后):

代码语言:javascript
运行
复制
    <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>

祝你今天愉快!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70654020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档