资源这个词具有非常广泛的意义。任何对象都可以是一个资源。一个在用户 界面中经常使用的Brush或者Color可以是一个资源。一段文本或者一个图形也可 以是一个资源。没有什么特殊的对象不可以成为一个资源。资源的底层处理机制 确保了获取你所需要的资源成为可能,而不闭关心这个资源是什么;同时,这套 机制可以简单的识别和定位对象。
资源管理的核心是ResourceDictionary这个类。这是一个相当简单的集合类 ,就像一个普通的Hashtable,允许以关键字聚合对象,同时提供一个索引器, 从而获取到使用了这些关键字的对象。因此,原则上,使用ResourceDictionary 就像使用一个Hashtable一样,正如范例6-1所示:
示例6-1
ResourceDictionary myDictionary = new ResourceDictionary( );
myDictionary.Add("Foo", "Bar");
myDictionary.Add("HW", "Hello, world");
Console.WriteLine (myDictionary["Foo"]);
Console.WriteLine(myDictionary["HW"]);
实际上,没有必要如此创建一个ResourceDictionary对象。代替的,你可以 正常
使用由WPF提供的一些资源字典。例如,FrameworkElement基类——用户界面 的大部分元素都从中派生,对外暴露一个名为Resources的属性,这就是一个资 源字典。此外,在Xaml标记中,也可以看到这些资源字典的,正如示例6-1所示 :
示例6-2
<?Mapping XmlNamespace="urn:System" ClrNamespace="System" Assembly="mscorlib" ?>
<Window x:Class="ResourcePlay.Window1" Text="ResourcePlay"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
xmlns:s="urn:System">
<Window.Resources>
<SolidColorBrush x:Key="Foo" Color="Green" />
<s:String x:Key="HW">Hello, world</s:String>
</Window.Resources>
<Grid Name="myGrid">
</Grid>
</Window>
x:Key这个属性指定了资源字典中的关键字。原则上,你可以使用任何类型的 对象作为关键字,然而实际上,String是最普遍的选择,尽管资源字典中使用的 是存储在公有属性中的截然不同的对象实例。
当使用xaml导入资源字典时,WPF可能会选择推迟资源的生成。在特定的环境 下,这种做法可以使得xaml资源树的一部分仍然以二进制形式(BAML)存在。只 有在需要的时候,才会还原这部分需要的资源。如果在界面出现时并不需要所有 的对象,这样做可以明显加快用户界面的启动时间。除了加快速度,这种优化在 极大程度上对代码行为并没有直接的效果。尽管如此,如果你的xaml标签出错了 ,因延迟创建而产生的错误,其浮现的时间可能会超过你的预计。
#译者注:微软推荐XAML被编译成BAML(Binary Application ...二进制语言 程序标记语言)。
示例6-3展示了如何获取示例6-2中定义的资源