如果我们需要对一些控件使用不同的字体大小时,我们可以通过硬编码的方式实现。但更好的方式是通过资源(Resource)。这里所说的资源并不是我们用用VS开发时的资源,那种资源一般是assembly 资源。
WPF中的资源指的是本地定义的资源,因为它们是定义在XAML(或者C#)中,并且与一个元素或者应用程序绑定。特定的资源只会对被资源定义的控件和其派生子控件有用。我们可以认为它是XAML对C#静态只读字段(static read-only)的一种补偿。和静态只读字段一样,资源对象在运行时被创建并且被与其相关的控件共用。
资源被存储在ResourceDictionary中,三个基础类:FrameworkElement,FrameContentElement,Application都定义了ResourceDictionary类型的字段Resources。在ResourceDictionary中的每一项都有一个key值来识别对象。通常情况下,这些key值都是字符串,XAML定义了一个属性x:key来定义资源的key值。
从FrameworkElement继承的所有类都有一个Resources集合属性。我们一般总是将资源段定义在元素的属性开始部分。因为我们需要在引用它之前就进行定义。如:
<StackPanel>
<StackPanel.Resources>
...
</StackPanel.Resources>
...
</StackPanel>
在Resources段中定义的资源可以被应用在整个StackPanel中,在Resources中的每个resource都是如下表示:
<SomeType x:Key="mykey" ...>
...
</SomeType>
XAML元素可以引用通过扩展标记(markup extension)来引用key值表示的资源。扩展标记是XAML中使用的一个特殊字段。resources使用的特殊扩展标记是StaticResource。
下面的示例是定义了两种字体大小,并将他们绑定到StackPanel中。
在第二种表示FontSize的方法中,大括号(curly brackets)表示里面的表达式是扩展标记。实际上并没有StaticResource这个类。而是有一个从MarkupExtension继承的类StaticMarkupExtension包含了一个ResourceKey属性。StaticResource被表示为一个扩展标记,是因为它提供了一种在XAML中的处理事情的方法,这些事情通常只能被程序代码访问。StaticResourceExtension提供了通过key访问的值。
另外还有两种扩展标记:x:Static和DynamicResource。它们也是用大括号包围。大括号表名在它里面有扩展标记,不允许有别的引用。
同一个Resouces中的key值不能重复。但不同Resources中的key可以相同。定义同名的资源是一种很强大的技术,尤其是对Styles来说。Styles可以定义应用于多个元素的属性,以及元素属性改变以及事件发生时的处理方法。在实际的wpf编码中,Resources经常在Styles中使用。
我们也可以通过代码将对象添加到资源集合中去。
如:stack.Resources.Add("brushText", new SolidColorBrush(Colors.Blue));
可以通过FindResource函数来查找特定key值的资源。
XAML定义了一个扩展标记x:Static来引用静态属性或字段。如:Content="{x:Static SomeClass:SomeStaticProp}"。通常可以在C#代码中定义静态字段,然后在XAML中进行访问。但是一定要在XAML中引用该类。
现在我们知道如何将对象定义为resources并且通过StaticResource标记来引用这些对象。也知道了如何定义静态属性和字段并通过x:Static来访问它。我们还要了解如何引用一个特定对象的示例字段和属性,这就需要使用DataBinding完成。
当两个对象的属性需要关联变化时,我们需要用DynamicResource代替StaticResource。StaticResource和DynamicResource是两种不同的访问资源的方式,他们都需要通过key来访问对象。对于StaticResource,key值只用来访问对象一次,然后对象被保留。对于DynamicResource,key值被保留,然后对象在需要时访问返回。
DynamicResource的主要目的是访问系统资源。不要过度的覆盖DynamicResource来达到过多的期望。在资源改变时并没有通知的概念。如果我们希望控件元素在其他对象的属性改变时改变自己。我们最好使用DataBinding。
msdn: http://msdn.microsoft.com/zh-cn/library/ms750613.aspx
other:http://www.cnblogs.com/zlgcool/archive/2008/10/18/1314281.html
http://www.cnblogs.com/YilingLai/archive/2007/01/25/605469.html
http://www.rainsts.net/article.asp?id=757