资源
资源
从样式示例可以看出,样式通常存储在资源中。可以在资源中定义任意元素,例如,前面从按钮的背景样式创建了笔刷,它本身就可以定义为一个资源,这样就可以在需要笔刷的地方使用它了。
下面的示例在StackPanel资源中定义了LinearGradientBrush,它的键名是MyGradientBrush使用StaticResource标记扩展将Background属性赋予MyGradientBrush资源。
<Window x:Class="样式模版和资源.资源" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="资源" Height="300" Width="300"> <StackPanel> <StackPanel.Resources> <LinearGradientBrush x:Key="MyGradientBrush" StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Offset="0.0" Color="LightCyan"/> <GradientStop Offset="0.14" Color="Cyan"/> <GradientStop Offset="0.7" Color="DarkCyan"/> </LinearGradientBrush> </StackPanel.Resources> <Button Name="button1" Width="200" Height="50" Foreground="White" Background="{StaticResource MyGradientBrush}"> Click Me! </Button> </StackPanel> </Window>
这里,资源用StackPanel定义。在上面的例子中, 资源用Window元素定义。基类FrameworkElement定义了ResourceDictionary类型的Resources属性。这就是资源可以用派生自FrameworkElement的所有类(任意WPF元素)来定义的原因。
资源是按层次结构来搜索的。如果用Window元素定义资源,它就会应用于Window的所有子元素。如果Window包含一个Grid,该Grid包含一个StackPanel,资源是用于StackPanel定义的,该资源就会应用于StackPanel中的所有控件。如果StackPanel包含一个按钮,但只为该按钮定义了资源,这个样式就只对该按钮有效。
1.系统资源
还有许多系统级的颜色和字体资源,可用于所有应用程序。这些资源用SystemColors,SystemFonts和SystemParameters类定义。
2.在代码中访问资源
要在后台代码中访问资源,基类FrameworkElement实现了方法FindResource(),可以给每个WPF对象调用方法FindResource().
3. 动态资源
在StaticResource标记扩展中,资源是在加载期间搜索。如果在运行程序中改变了资源,就应使用DynamicResource标记扩展。