将 SolidColorBrush 绑定到 ControlTemplate 背景 [英] Binding SolidColorBrush to ControlTemplate Background
问题描述
我试图将 SolidColorBrush 绑定到 TabItem 的控制模板中的边框的背景属性.但是当我更改 SolidColorBrush Resource 的值时,它说无法在对象 '#FF808080' 上设置属性,因为它处于只读状态."与没有 ControlTemplate 的股票按钮一样,它可以完美运行.
Hi i tried to bind SolidColorBrush to the Background property of border in Control Template For TabItem. But When im changing the value of SolidColorBrush Resource it Says "Cannot set a property on object '#FF808080' because it is in a read-only state." Where as with stock button without ControlTemplate it works perfectly.
这是我的代码.(XAML)
Here's my code. (XAML)
<Window.Resources>
<SolidColorBrush x:Key="SolidColorBrush2" Color="Gray"/>
<SolidColorBrush x:Key="SolidColorBrush3" Color="Black"/>
<Style x:Key="TabItemTemplate" TargetType="TabItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border Name="Tab" Height="30" Padding="10 0" Margin="0 0 10 0">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White">
<ContentPresenter x:Name="TabItemContent" HorizontalAlignment="Center" VerticalAlignment="Center" ContentSource="Header"></ContentPresenter>
</TextBlock>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Tab" Property="Background" Value="{DynamicResource SolidColorBrush3}"/>
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Tab" Property="Background" Value="{DynamicResource SolidColorBrush2}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TabControl Name="TabControlRepaymentWorkflowInner" Grid.Row="0">
<TabItem Header="ABC" Style="{DynamicResource TabItemTemplate}" Foreground="White">
<StackPanel Orientation="Vertical" Margin="0 0 5 0" HorizontalAlignment="Center">
<TextBlock Margin="5 0 0 0" Text="Enter note for Front Office"/>
<Button Background="{DynamicResource SolidColorBrush2}" Content="Button1"/>
</StackPanel>
</TabItem>
<TabItem Header="DEF" Style="{DynamicResource TabItemTemplate}" Foreground="White">
<StackPanel Orientation="Vertical" Margin="0 0 5 0" HorizontalAlignment="Center">
<TextBlock Margin="5 0 0 0" Text="Enter note for Front Office"/>
<Button Background="{DynamicResource SolidColorBrush2}" Content="Button2"/>
</StackPanel>
</TabItem>
<TabItem Header="GHI" Style="{DynamicResource TabItemTemplate}" Foreground="White">
<StackPanel Orientation="Vertical" Margin="0 0 5 0" HorizontalAlignment="Center">
<TextBlock Margin="5 0 0 0" Text="Enter note for Front Office"/>
<Button Background="{DynamicResource SolidColorBrush2}" Content="Button3"/>
</StackPanel>
</TabItem>
</TabControl>
<Button Grid.Row="1" HorizontalAlignment="Center" Height="30" VerticalAlignment="Top" Click="ChangeTheme_Click">Change Theme</Button>
</Grid>
这是我的 C# 代码
private void ChangeTheme_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush brush2 = (SolidColorBrush)Resources["SolidColorBrush2"];
SolidColorBrush brush3 = (SolidColorBrush)Resources["SolidColorBrush3"];
brush2.Color = Color.FromArgb(255, 200, 200, 200);
brush3.Color = Color.FromArgb(255, 251, 132, 61);
}
和错误:
推荐答案
请原谅我,您的主题设置不正确.不要更改 SolidColorBrush 的属性,而是进行整个资源项替换,如这篇文章中所述:参见@Łukasz Rejman 答案
Pardon me but you're doing theming incorrectly. Instead of changing SolidColorBrush's properties, go for entire resource item replacement, as described in this post here on SO: see @Łukasz Rejman answer
例如:
Resources["SolidColorBrush2"] = new SolidColorBrush(Color.FromArgb(255, 200, 200, 200));
Resources["SolidColorBrush3"] = new SolidColorBrush(Color.FromArgb(255, 251, 132, 61));
这篇关于将 SolidColorBrush 绑定到 ControlTemplate 背景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!