在WPF中,StaticResource
和 DynamicResource
用于资源的定义和使用,它们在资源解析和更新的方式上有所不同。
StaticResource
定义:StaticResource
是在编译时解析资源,并在控件使用时获取资源的引用。资源在解析后不会再动态更新。
用法:适用于不需要动态更新的资源,性能较好。
实例:
1,定义资源字典(例如,Colors.xaml
):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="ApplicationBackgroundColor">#1e1c1c</Color>
<SolidColorBrush x:Key="ApplicationBackgroundBrush" Color="{StaticResource ApplicationBackgroundColor}" />
</ResourceDictionary>
2,在 App.xaml
中引用资源字典:
<Application x:Class="YourNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Colors.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
3,在 MainWindow.xaml
中使用 StaticResource
:
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800"
Background="{StaticResource ApplicationBackgroundBrush}">
<Grid>
<TextBlock Text="Hello, World!" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
DynamicResource
定义:DynamicResource
是在运行时解析资源,控件在使用时会在资源字典中查找资源引用。当资源在运行时发生变化时,使用该资源的控件会自动更新以反映资源的变化。
用法:适用于需要在运行时动态更新的资源,性能稍差但提供了动态资源更新的能力。
实例:
1,定义资源字典(例如,Colors.xaml
):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="ApplicationBackgroundColor">#1e1c1c</Color>
<SolidColorBrush x:Key="ApplicationBackgroundBrush" Color="{DynamicResource ApplicationBackgroundColor}" />
</ResourceDictionary>
2,在 App.xaml
中引用资源字典:
<Application x:Class="YourNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Colors.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
3,在 MainWindow.xaml
中使用 DynamicResource
:
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800"
Background="{DynamicResource ApplicationBackgroundBrush}">
<Grid>
<TextBlock Text="Hello, World!" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
4,在代码中动态更新资源:
using System.Windows;
using System.Windows.Media;
namespace YourNamespace
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ChangeBackgroundColor();
}
private void ChangeBackgroundColor()
{
// 更新资源字典中的颜色
Application.Current.Resources["ApplicationBackgroundColor"] = Color.FromRgb(34, 139, 34); // 绿色
}
}
}
StaticResources的适用场合:
(1)在资源第一次引用之后无需再修改资源的值。
(2)资源引用不会基于运行时的行为进行重新计算,比如在重新加载Page/Window的时候。
(3)当需要设置的属性不是DependencyObject或Freezable类型的时候,用StaticResource。
(4)当需要将资源编译到dll中,并打包为程序的一部份,或者希望在各应用程序之间共享时,也使用StaticResource。
(5)当需要为一个自定义控件创建一个Theme,并Theme中使用资源,就需要使用StaticResource。因为StaticResource的资源查找行为时可预测的,并且本身包含在Theme中。而对于DynamicResource,即使资源是定义在Theme中,也只能等到运行时确定,导致一些可能意料不到的情况发生。
(6)当需要使用资源设置大量的依赖属性(Dependency Property)的时候。
由于依赖属性具有属性系统提供的值缓存机制,所以,如果能在程序装载时设置依赖属性的值,这样,依赖属性就不需要检查自己的值并返回最后的有效值了。
Dynamic Resource的适用场合:
(1)资源的值依赖一些条件,而该条件直到运行时才能确定。
包括系统资源,或是用户可设置的资源。比如:可以创建引用系统属性诸如SystemColors,SystemFonts来设置值,而这些属性是动态的,它们的值又来自于运行环境和操作系统。
(2)为自定义控件引用或创建Theme Style。
(3)希望在程序运行期间调整资源字典的内容时。
(4)希望资源可以向前引用时(如上面在Canvas中引用innerLgbResource一样)
(5)资源文件很大,希望在运行时才加载。
(6)要创建的Style的值可能来自于其它值,而这些值又依赖于Theme或用户的设置。
(7)当引用资源的元素的父元素有可能在运行期改变,这个时候也需要使用动态资源。因为父元素的改变将导致资源查询的范围。
Dynamic resource的限制条件:属性必须是依赖属性,或是Freezable的。