Стилизатор стилей Морозильная щетка
Кажется, я столкнулся с некоторым поведением в отношении 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.
Может кто-нибудь объяснить, что происходит с этим странным поведением, и если это из-за конструкции или ошибка?
Спасибо брэндон