我在后面的代码中有条件地更改了我的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);
按钮按预期更改颜色(使用应用程序范围的主题时)。
答案 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}"
Background
setter。答案 2 :(得分:0)
不幸的是,这是一个简单的问题,没有简单的答案(到目前为止我已找到)。采取不同的方式来满足用户是我的最终解决方案。
如果不存在数据,我只需将TabItem前景颜色更改为灰色,而不是尝试更改TabItem背景颜色。我还添加了“Blank”这样的单词:“Tab 1 Blank”,“Tab 2 Blank”等。这是对原始问题的有效解决方案。 I describe it in detail here.