WPF StaticResource vs DynamicResource

我有我的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,则不会引发异常。

我认为使资源冻结会使与资源链接的对象的属性为只读。 这就是为什么当更改属性时,它会通过异常抱怨readonly状态。 然而,冻结并不能阻止我们改变对象本身。

链接地址: http://www.djcxy.com/p/50425.html

上一篇: WPF StaticResource vs DynamicResource

下一篇: Unable to apply StaticResource from different xaml file