WPF:无法通过代码更改样式SolidColorBrush因为只读状态

时间:2017-07-12 04:27:16

标签: wpf styles

所以在Window.Resources里面我有SolidColorBrush

在单独的文件(GridViewColumnHeader.xaml)中,我有Style

<Style x:Key="ListViewHeaderDefaultStyle" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                <Border BorderThickness="0,0,0,1" BorderBrush="Gray" Background="Transparent">
                    <TextBlock 
                            x:Name="ContentHeader"
                            Text="{TemplateBinding Content}"
                            Padding="0,5,0,0"
                            Width="{TemplateBinding Width}"
                            TextAlignment="Left"
                            Margin="5,0,0,0"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Foreground" Value="{DynamicResource GridViewColumnHeaderForegroundColor}" />
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontSize" Value="12" />
</Style>

现在希望我尝试做的是通过后面的代码更改我的Style Foreground颜色:

SolidColorBrush solidColorBrush = (SolidColorBrush)this.TryFindResource("GridViewColumnHeaderForegroundColor");
if (solidColorBrush != null)
    solidColorBrush.Color = Colors.Black;

但是出于某种原因得到了这个InvalidOperationException

  

附加信息:无法在对象上设置属性&#39;#FFDCDCDC&#39;   因为它处于只读状态。

1 个答案:

答案 0 :(得分:1)

您可以定义另一个画笔并将其指定给样式的前景,而不是更改资源画笔。

但是,还有另一种方法可以实现目标。 Have a look here.

首先,您应该将使用的样式声明为dynamicresource。

示例:

<ListView VerticalAlignment="Bottom" Height="63" IsSynchronizedWithCurrentItem="True">
    <ListView.View>
        <GridView x:Name="test" ColumnHeaderContainerStyle="{DynamicResource ListViewHeaderDefaultStyle}" >
            <GridViewColumn Header="header1"/>
        </GridView>
    </ListView.View>
</ListView>

现在您可以通过更改资源画笔来简单地更改前景颜色:

this.Resources["GridViewColumnHeaderForegroundColor"] = Brushes.Black;