Стилизатор стилей Морозильная щетка

Кажется, я столкнулся с некоторым поведением в отношении WPF ResourceDictionaries, кистей и стилей (по крайней мере, это то, что я заметил до сих пор), что противоречит моему пониманию того, как эти вещи должны работать. По сути, если я ссылаюсь на Brush из Setter с помощью Style в ResourceDictionary, это приводит к замораживанию Brush. Пример ниже иллюстрирует это, поскольку я получаю InvalidOperationException, когда я пытаюсь изменить Цвет на общей Кисти в обработчике события Click моей кнопки. Это должно привести к изменению цвета обоих Rectangle, так как они используют одну и ту же общую кисть, но вместо этого я получаю исключение.

<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;
    }
}

Если я просто удаляю Стиль (точнее Сеттер) и ссылаюсь на Кисть (все еще из ResourceDictionary) непосредственно из каждого прямоугольника, я получаю ожидаемое поведение цветов прямоугольников, изменяющихся в тандеме, из события нажатия кнопки. См. Код ниже (событие нажатия кнопки остается прежним).

<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>

Я вижу только замораживание кисти, когда на нее ссылаются как на StaticResource из установщика стиля. Я могу на самом деле ссылаться на ту же кисть из других мест в ResourceDictionary без ее замораживания; то есть содержимое ControlTemplates.

Может кто-нибудь объяснить, что происходит с этим странным поведением, и если это из-за конструкции или ошибка?

Спасибо брэндон

Ответы на вопрос(1)

Ваш ответ на вопрос