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