我的 Xaml 如下
<Window.Resources>
<SolidColorBrush x:Key="BrushMe" Color="Red"/>
<SolidColorBrush x:Key="FreezeBrushMe" po:Freeze="true" Color="Yellow"/>
</Window.Resources>
<StackPanel>
<Button Background="{StaticResource BrushMe}">Static</Button>
<Button Background="{DynamicResource BrushMe}">Dynamic</Button>
<Button Click="Button_Click">ChangeColorProperty</Button>
<Button Click="Button1_Click">ChangeBrushObject</Button>
<!--<Button Background="{StaticResource NotExistResource}" Click="Button_Click_1">GenerateResourceForStatic</Button>-->
<Button Background="{DynamicResource NotExistResource}" Click="Button_Click_1">GenerateResourceForDynamic</Button>
<Button Background="Green" Click="Button_Click_1">FixedBrush</Button>
<Button Background="{StaticResource FreezeBrushMe}">FreezeBrushStatic</Button>
<Button Background="{DynamicResource FreezeBrushMe}">FreezeBrushDynamic</Button>
<Button Click="Button_Click_2">ChangeFreezeColorProperty</Button>
<Button Click="Button_Click_3">ChangeFreezeBrushObject</Button>
</StackPanel>
在我后面的代码中,它看起来像
private void Button_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush brush = (SolidColorBrush)this.FindResource("BrushMe");
brush.Color = Colors.Blue;
this.Resources["BrushMe"] = brush;
}
private void Button1_Click(object sender, EventArgs e)
{
SolidColorBrush newBrush = new SolidColorBrush(Colors.Yellow);
this.Resources["BrushMe"] = newBrush;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
this.Resources.Add("NotExistResource", new SolidColorBrush(Colors.Green));
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
SolidColorBrush brush = (SolidColorBrush)this.FindResource("FreezeBrushMe");
brush.Color = Colors.Blue;
this.Resources["FreezeBrushMe"] = brush;
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
SolidColorBrush newBrush = new SolidColorBrush(Colors.Red);
this.Resources["FreezeBrushMe"] = newBrush;
}
我的问题是,如果我先单击 ChangeBrushObject 按钮,它会将动态按钮更改为黄色,然后单击 ChangeColorProperty 按钮,它只会将动态按钮更改为蓝色,而不影响静态按钮。
但是,如果我自己单击 ChangeColorProperty 按钮,它会将静态和动态按钮都更改为蓝色。
为什么它会这样?尝试将新对象分配给已被控件引用为静态资源的资源时,WPF 不会引发任何警告?
我还测试了动态资源引用的不存在资源。正如预期的那样,如果 StaticResource 引用了不存在的资源,Xaml 将在编译时抱怨,而 DynamicResource 不会。但是,如果我单击 GenerateResourceForDynamic 按钮,它会显示绿色作为背景,但随后会消失,然后再次出现并重复。为什么会这样?
编辑:添加了冻结资源,再次出现奇怪的行为。如果我单击 ChangeFreezeColorProperty 按钮,它将通过异常。如果我单独单击 ChangeFreezeBrushObject,它将更改 FreezeBrushDynamic 按钮颜色。但是,如果我单击 ChangeFreezeBrushObject,然后单击 ChangeFreezeColorProperty,则不会引发异常。
我认为进行资源冻结将使与资源链接的对象的属性为只读。这就是为什么在更改属性时,它将通过异常抱怨只读状态。然而 freeze 并不能阻止我们改变对象本身。