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按钮都变色了。
为什么呢?
-
引用共享:在WPF中,资源是共享的。当我们定义一个SolidColorBrush资源并将它分配给i多个控件时,这些控件实际上共享同一个SolidColorBrush对象的引用;
-
尽管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"/>