在代码隐藏中,我如何覆盖由应用程序范围的主题设置的tabitem颜色?

时间:2011-07-28 15:27:47

标签: wpf xaml binding

我在后面的代码中有条件地更改了我的TabItem的背景颜色。只要App.xaml中没有设置主题,这样就可以正常工作。 如何在保持应用程序范围的主题的同时更改TabItem的颜色(在代码中)?

背景:

我正在使用Nukeation Reuxables中的免费WPF主题。主题在我的App.xaml的Application.Resources部分中设置:

<ResourceDictionary Source="/ReuxablesLegacy;component/Edge.xaml" />

我正试图在后面的代码中有条件地设置TabItem的背景颜色:

MyTabItem.Background = new SolidColorBrush(Colors.Gray);

如果我删除或注释掉设置主题的App.xaml行,背景颜色会发生变化。为什么主题会破坏我的代码?我正在更改选项卡颜色(加载数据时)以显示哪些选项卡包含数据。

我知道XAML和绑定通常用于改变颜色,但我尝试的解决方案似乎过于复杂。 Here is my related StackOverflow question寻求所有XAML和绑定解决方案。给出的答案只是提出了一些我没有找到答案的问题。

提前致谢。

修改

更改按钮背景时出现问题

button1.Background = new SolidColorBrush(Colors.Red);

按钮按预期更改颜色(使用应用程序范围的主题时)。

3 个答案:

答案 0 :(得分:0)

真的取决于主题本身的实现方式。如果主题使用TemplateBinding将选项卡的背景颜色绑定到主题的控件,那么解决方案背后的代码将起作用。这可能 为什么你的按钮在你的例子中正确地改变了背景颜色。

你可能需要深入研究选项卡的样式xaml,并在那里修改它以使代码隐藏解决方案起作用。

答案 1 :(得分:0)

如果你看ControlTemplate TabItem Background的{​​{1}}属性绑定到内部资源它没有TemplateBinding,我认为主题刚刚给出它的颜色。为了让你的代码工作,你必须重新设计它。

 <Style TargetType="{x:Type TabItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}">
                            <Grid>
                                <Border 
                Name="Border"
                Margin="0,0,-4,0" 
                Background="{TemplateBinding Background}"
                BorderBrush="{StaticResource SolidBorderBrush}" 
                BorderThickness="1,1,1,1" 
                CornerRadius="2,12,0,0" >
                                    <ContentPresenter x:Name="ContentSite"
                  VerticalAlignment="Center"
                  HorizontalAlignment="Center"
                  ContentSource="Header"
                  Margin="12,2,12,2"
                  RecognizesAccessKey="True"/>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Panel.ZIndex" Value="100" /> 
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
                                    <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

我对普通ControlTemplate做了两处更改,你可以对你的theme.xaml做同样的事情。

  • Background="{StaticResource LightBrush}"更改为Background="{TemplateBinding Background}"
  • 在IsSelected = True触发器中删除了Background setter。

答案 2 :(得分:0)

不幸的是,这是一个简单的问题,没有简单的答案(到目前为止我已找到)。采取不同的方式来满足用户是我的最终解决方案。

如果不存在数据,我只需将TabItem前景颜色更改为灰色,而不是尝试更改TabItem背景颜色。我还添加了“Blank”这样的单词:“Tab 1 Blank”,“Tab 2 Blank”等。这是对原始问题的有效解决方案。 I describe it in detail here.