简单的说,资源也就是在dictionary中存储的值。是Key和Value的对应。
通常定义资源的方式就是直接在XAML中定义。如:
<Window.Resources>
<SolidColorBrush x:Key="myBrush" Color="Red" />
</Window.Resources>
放在Window.Resources标签中的资源属于整个窗体。任何框架元素都可以拥有资源。通常将资源定义在Window、Page甚至Application中。
定义了资源之后,我们就可以这样引用它:
<Button BorderBrush="{StaticResource myBrush}" ...>7</Button>
这句话的意思就是找到Key为myBrush的静态资源,并将其值赋给BorderBrush属性。
所谓静态是值不发生变化,相对于动态而言的。
如果有多个控件的BorderBrush属性需要设置为统一的值,为了便于日后维护,就可以使用如上的方法。其实,这种方法还是有所不便:你要为每个控件做如上的赋值。
资源只能被位于拥有资源的对象内部使用,也就是说可以有拥有资源的对象自己或者其内部包含的对象使用。资源查找的方式是沿着层级关系向上查找。
也可以使用专门的XAML文件来定义资源。如,可将下列代码保存到一个单独的XAML文件。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/
presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<SolidColorBrush x:Key=" myBrush" Color="Yellow"/>
</ResourceDictionary>
然后讲文件包含到对象的资源定义中去。
<Window.Resources>
<ResourceDictionary Source="Dictionary1.xaml"/>
</Window.Resources>
如果资源定义需要包含多个资源文件,可以使用MergedDictionary。
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml"/>
<ResourceDictionary Source="Dictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
也可以在定义资源时,即包含资源文件,又包含直接定义的资源:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml"/>
<ResourceDictionary>
<SolidColorBrush x:Key="myBrush" Color="Red" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
如果重复定义了资源,则后定义的资源有效。
在代码中使用资源:
我们可以使用查找的方式:
button9.BorderBrush = (Brush)FindResource("myBrush");
也可以这样,以免在找不到资源时抛出异常:
button9.BorderBrush = (Brush)TryFindResource("myBrush");
添加或者更新资源的方法很简单:
this.Resources["myBrush"] = new SolidColorBrush(Colors.Green);
这里this表示窗体。如果需要操作当前应用程序的资源,可以这样做:
Application.Current.Resources["myBrush"] = new
SolidColorBrush(Colors.Green);
动态资源
如果我们使用的资源可以在定义后发生变化,希望此变化体现到使用此资源的对象上,需要使用动态资源,操作的方法如此简单,只是需要把使用静态资源方式中的StaticResource换为DynamicResource。
<Button BorderBrush="{DynamicResource myBrush}" ...>7</Button>
使用动态资源时,只有在需要的时候才会读取资源的值。
在代码中使用动态资源的方法也很简单:
button9.SetResourceReference(Button.
BorderBrushProperty,"myBrush");
依赖属性
WPF使用Dictionary存储依赖属性,其读写的方法如下:
public Color BackColor
{
get {return (Color)GetValue(BackColorProperty);}
set {SetValue(BackColorProperty,value);}
}
依赖属性只有在赋值后才会出现在Dictionary中。
可以在代码中定义资源,然后引用。如:
<Rectangle Fill="{x:Static SystemColors.WindowBrush}" />
但如果喜欢其值跟着发生变化,则可以这样:
<Rectangle
Fill="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />