一、资源(Resource)的定义
资源是保存在可执行文件中的一种不可执行数据。在WPF的资源中,几乎可以包含图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。
也就是说,应用程序中非程序代码的内容,比如点阵图、颜色、字型、动画/影片档以及字符串常量值,可将它们从程序中独立出来,单独包装成"资源(Resource)"。
资源的范围(层级):
WPF提供一个封装和存取资源(resource)的机制,我们可将资源建立在应用程序的不同范围上。WPF中,资源定义的位置决定了该资源的可用范围。资源可以定义在如下范围中:
- 物件级:此时,资源只能套用在这个Object物件,或套用至该物件的子物件。
- 文件级:如果将资源定义在Window或Page层级的XAML档中,那么可以套用到这个文件中的所有物件。
- 应用程序级:如果我们将资源定义在App.xaml 中,那么,就可以将资源套用到应用程序内的任何地方。
- 字典级:当我们把资源封装成一个资源字典, 定义到一个ResourceDictionary的XAML文件时,就可以在另一个应用程序中重复使用。
每一个框架级元素( FrameworkElement 或者 FrameworkContentElement )都有一个资源属性。每一个在资源字典中的资源都有一个唯一不重复的键值(key),在标签中使用x:Key属性来标识它。
一般地,键值是一个字符串,但你也可以用合适的扩展标签来设置为其他对象类型。非字符键值资源使用于特定的WPF区域,尤其是风格、组件资源,以及样式数据等。
当资源被存储进资源词典后,我们可以通过两种方式来使用这些资源一一静态方式和动态方式。 Static指的是程序的非执行状态而 Dynamic指的是程序运行状态。对于资源的使用, Static 和 Dynamic也是这个意思。
静态资源( StaticResource) 指的是在程序载入内存时对资源的一次性使用,之后就不再去访问这个资源了:
动态资源( DynamicResource) 指的是在程序运行过程中仍然会去访问资源。动态资源强制在每次访问此类资源时都重新进行查找。所以动态资源需要使用的系统开销大于静态资源的系统开销。
如果你确定某些资源只在程序初始化的时候使用一次、之后不会再改变,就应该使用StaticResource,而程序运行过程中还有可能改变的资源应该以 DynamicResource 形式使用。
二、示例
Title="test" Height="300" Width="300">
<Window.Resources>
<SolidColorBrush x:Key="ButtonBrush" Color="Red"/>
</Window.Resources>
<StackPanel>
<Button Margin