scova de congelação para estilet

Eu pareço ter cometido algum comportamento em relação aos Dicionários, pincéis e estilos do WPF (pelo menos é o que eu notei até agora), o que contraria minha compreensão de como essas coisas devem funcionar. Basicamente, se eu fizer referência a um pincel de um setter dentro de um estilo em um ResourceDictionary, ele fará com que o pincel fique congelado. O exemplo abaixo ilustra isso, pois recebo uma InvalidOperationException quando tento alterar a Cor no pincel compartilhado no manipulador de eventos Click do meu botão. Isso deve fazer com que a cor do retângulo seja alterada, pois ambos usam o mesmo pincel compartilhado, mas, em vez disso, recebo a exceçã

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <SolidColorBrush x:Key="TestBrush" Color="Red" />
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="{StaticResource TestBrush}" />
        </Style>
    </Window.Resources>
    <StackPanel>
        <Button Name="Button1" Content="Change Color" Click="Button1_Click" />
        <Rectangle Height="20" />
        <Rectangle Height="20" />
    </StackPanel>
</Window>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        var brush = (SolidColorBrush)FindResource("TestBrush");
        // InvalidOperationException Here.  Brush is Frozen/Read-Only
        brush.Color = Colors.Blue;
    }
}

Se eu simplesmente remover o estilo (mais especificamente o setter) e referenciar o pincel (ainda do ResourceDictionary) diretamente de cada retângulo, obtenho o comportamento esperado das cores dos retângulos alteradas em conjunto no evento de clique no botão. Veja o código abaixo (clique no botão evento hanlder permanece o mesmo

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <SolidColorBrush x:Key="TestBrush" Color="Red" />
    </Window.Resources>
    <StackPanel>
        <Button Name="Button1" Content="Change Color" Click="Button1_Click" />
        <Rectangle Height="20" Fill="{StaticResource TestBrush}" />
        <Rectangle Height="20" Fill="{StaticResource TestBrush}" />
    </StackPanel>
</Window>

Só vejo o Pincel congelando quando é referenciado como StaticResource no Setter de um estilo. Posso referenciar completamente o mesmo pincel de outros locais no ResourceDictionary sem que ele fique congelado; ou seja, o conteúdo dos ControlTemplates.

Alguém pode explicar o que está acontecendo com esse comportamento estranho e se é por design ou um bu

brigado, Brandon

questionAnswers(2)

yourAnswerToTheQuestion