书名:WPF专业编程指南
作者:李应保
出版社:电子工业出版社
出版时间:2010-01
ISBN:9787121100116
一、资源的作用范围
- 前面提到,FramewrkElement和FrameworkContentElement中都含有Resources属性,而WPF中的UI元素都是从这两个类中派生出来的;换句话说,可以在任何UI元素内加入资源。
WPF对其中的唯一要求是哈希表中的关键字Key必须是唯一的,在UI元素中使用关键字Key来引用资源。
虽然在同一个元素的资源里,不能使用同一个关键字来定义不同的资源,但在不同的元素里,却可以使用其他元素资源中已经使用过的关键字。
那么,在用关键字引用资源时,究竟是引用哪个资源呢?
二、例子
- 把前面的例子稍微修改一下,在StackPanel中加入资源:
<StackPanel.Resources>
<SolidColorBrush x:Key =
"YellowBrush">Blue</SolidColorBrush>
</StackPanel.Resources>
- 这里定义了关键字为“YellowBrush”的填充画刷,与Window中的一个画刷的关键字是相同的,但是所用的颜色不同,由于YellowBrush位于两个不同的UI元素中,编译程序并不产生任何错误。请看下面的XAML:
<Window x:Class="Yingbao.Chapter8.StaticResourceExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="使用静态资源扩张的例子" Height="100" Width="400">
<Window.Resources>
<SolidColorBrush x:Key ="YellowBrush">Yellow</SolidColorBrush>
<SolidColorBrush x:Key ="RedBrush">Red</SolidColorBrush>
<sys:Double x:Key ="LargeFont">20</sys:Double>
<sys:Double x:Key ="SmallFont">10</sys:Double>
</Window.Resources>
<StackPanel >
<StackPanel.Resources>
<SolidColorBrush x:Key ="YellowBrush">Blue</SolidColorBrush>
</StackPanel.Resources>
<Button Height ="30">
<Button.Background>
<StaticResource ResourceKey ="RedBrush"/>
</Button.Background>
<Button.FontSize>
<StaticResource ResourceKey ="LargeFont"/>
</Button.FontSize>
红色大字按钮
</Button>
<Button Height ="30" Background ="{StaticResource YellowBrush}"
FontSize ="{StaticResource SmallFont}">黄色小字按钮
</Button>
</StackPanel>
</Window>

图8-9 使用静态资源扩展来访问静态资源
- 这段程序的运行结果如图8-9所示。由图8-9可见,第二个按钮现在使用的是StackPanel中定义的资源,而不再是Window中定义的资源了。
三、传递和覆盖的规则
资源在元素树中的传递和覆盖的规则与相关属性的传递和覆盖的规则一样:
● 资源从树根元素向树枝元素传递;
● 若资源在传递路径中被重新定义,则原来的资源就不再向下面的树杈传递,转而传递新定义的元素。需要注意的是,这里说的“传递”是一种通俗的说法。与传递事件真的在元素树中动态传递不同,资源的传递实际上发生在引用该资源的地方,WPF从该元素沿着元素树向树根寻找某个资源的过程。
一旦找到了某个资源,WPF就使用该资源,而不再寻找了,虽然表面上看似乎是在“传递”和“覆盖”,但其内部的机理却大不相同。