WPF笔记6——静态资源(StaticResource) 与 动态资源(DynamicResource)

示例代码1

前台代码:

点击查看代码
<Window x:Class="TestWPF.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestWPF"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">

    <Window.Resources>

        <!--定义一个名称是MyBrush的资源-->
        <SolidColorBrush x:Key="MyBrush" Color="Red"/>

    </Window.Resources>

    <StackPanel>

        <Button x:Name="btnChangeColor" Content="ChangeColor" Width="200" Height="80" Margin="20" Click="btnChangeColor_Click"/>


        <!--OK按钮DynamicResource方式引用MyBrush资源-->
        <Button x:Name="btnOK" Content="OK" Background="{DynamicResource MyBrush}"/>
        
        <!--Cancel按钮StaticResource方式引用MyBrush资源-->
        <Button x:Name="btnCancel" Content="Cancel" Background="{StaticResource MyBrush}"/>
 
    </StackPanel> 
</Window>

后台代码:

点击查看代码

        private void btnChangeColor_Click(object sender, RoutedEventArgs e)
        {
            var resource = this.Resources;
            if (resource.Contains("MyBrush"))
            {
                SolidColorBrush brush = (SolidColorBrush)resource["MyBrush"];

                brush.Dispatcher.Invoke(new Action(() =>
                {
                    //修改brush资源的颜色
                    brush.Color = Colors.LightPink;
                }));
            }
        }

Ok按钮与Cancel按钮都同时引用了MyBrush资源;

Ok按钮是DynamicResource引用MyBrush;

Cancel按钮是StaticResource引用MyBrush;

运行后,点击界面上的“ChangeColor”按钮,Ok按钮与Cancel按钮都变色了。

为什么呢?

  1. 引用共享:在WPF中,资源是共享的。当我们定义一个SolidColorBrush资源并将它分配给i多个控件时,这些控件实际上共享同一个SolidColorBrush对象的引用;

  2. 尽管Cancel按钮使用的是StaticResource,但它仍然引用了同一个SolidColorBrush对象。当我们通过代码更改MyBrush资源颜色时,实际上修改了这个共享对象的Color属性。因此,所以引用这个SolidColorBrush对象的控件(无论是通过DynamicResource 还是 StaticResource)都会看到颜色的变化。

解决方案

如果不希望Cancel按钮的颜色随资源变化而改变,可考虑以下几种方法:

方法1
修改btnChangeColor_Click事件:

点击查看代码
        private void btnChangeColor_Click(object sender, RoutedEventArgs e)
        {
            var resource = this.Resources;
            if (resource.Contains("MyBrush"))
            { 
                //移除MyBrush资源
                resource.Remove("MyBrush");

                //添加新资源,键是“MyBrush”
                resource.Add("MyBrush", new SolidColorBrush(Colors.DarkGoldenrod));
            }
        }

方法2
给Cancel按钮创建一个新的SolidColorBrush实例,而不是引用共享的资源。

点击查看代码
<Button Content="Cancel" Background="Red"/>
posted @ 2024-11-26 15:38  青云Zeo  阅读(5)  评论(0编辑  收藏  举报