首页 学海无涯 WPF 【WPF基础系列】资源简介
【WPF基础系列】资源简介
摘要 本文对WPF中资源的介绍与使用以及动态资源和静态资源的区别。

前言

本文是WPF基础系列第一篇,阅读本文需要了解XAML和标记扩展。

正文

XAML资源介绍

XAML资源包括brushes和styles等,每个框架集元素(FrameworkElementFrameworkContentElement)都有一个Resources属性,它的类型是ResourceDictionary,其中包含已定义的资源。我们可以在Resources中定义多个资源,然后给子元素使用。例如:

<Page Name="root"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Page.Resources>
        <SolidColorBrush x:Key="MyRed" Color="#FF0000"/>
    </Page.Resources>
    <StackPanel>
        <Button Background="{StaticResource MyRed}" Content="这个按钮背景色是#FF0000"/>
    </StackPanel>
</Page>

该示例在Page元素的Resources属性中定义了SolidColorBrush资源,然后给Button的Background属性使用。

Resources中的每个资源都必须有个唯一键,通过x:Key指令来指定,然后通过资源标记扩展(如StaticResourceDynamicResource)指定资源的键名来作用于某个控件上。

隐式键

尽管Resources中的每一项都必须有个唯一键,但并不是所有项都必须使用x:Key来指定,某些对象的键值(Style、DataTemplate等)可以与其他属性绑定,这种类型的键称为隐式键

Style是资源定义中比较重要的一种方式,如下:

<Window.Resources>
    <Style TargetType="Button">
        <Style.Setters>
            <Setter Property="Background" Value="Red" />
        </Style.Setters>
    </Style>
</Window.Resources>
<DockPanel>
    <Button Content="这个按钮背景色是Red" />
</DockPanel>

Style可以不需要x:key属性,而是通过TargetType属性来指定隐式键,TargetType可以直接指定类型名称,或者通过{x:Type}标记扩展返回一个Type。如:TargetType="{x:Type Button}"

上述示例可以看做Style的隐式键为typeof(System.Windows.Controls.Button),通过WPF的机制,Button不必指定Style属性或者对该特点样式的引用,该Style也将作用于页面上的Button。从Button角度来看,Button使用的隐式键就是自己本身的类型,也就是System.Windows.Controls.Button。

而一旦显式指定了键,使用的时候就必须设置控件的Style属性。如:

<Window.Resources>
    <Style x:Key="myButton" TargetType="Button">
        <Style.Setters>
            <Setter Property="Background" Value="Red" />
        </Style.Setters>
    </Style>
</Window.Resources>
<DockPanel>
    <Button Content="这个按钮背景色没变"/>
    <Button Content="这个按钮背景色是Red" Style="{StaticResource myButton}" />
</DockPanel>

与Style类似的还有DataTemplate,DataTemplate的隐式键是DataType的值而不是TargeType。

引用资源字典文件

我们在实际项目中可以把需要的资源定义在一个单独文件中,然后再引入到对应页面或者整个应用程序。如下:

1.添加资源字典文件

右键项目=》添加=》资源字典


这里我将文件命名为ResourceDictionaryDemo.xaml

2.定义资源

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:LeoChat.Client">
    <Style TargetType="Button">
        <Style.Setters>
            <Setter Property="Background" Value="Red"/>
        </Style.Setters>
    </Style>
</ResourceDictionary>

3.引入资源字典文件并使用

<Window.Resources>
    <ResourceDictionary Source="ResourceDictionaryDemo.xaml"/>
</Window.Resources>
<DockPanel>
    <Button Content="这个按钮背景色是Red"/>
</DockPanel>

Source路径写正确就可以使用我们在ResourceDictionaryDemo.xaml中定义的各种资源了。

静态资源和动态资源

一个资源可以被静态或动态引用,分别通过{StaticResource}{DynamicResource}标记扩展的方式引用。

静态资源在编译后便可在有效的资源字典中找到对应的资源,而动态资源则是在运行时才能确定它的值,因此动态资源可以在运行时更改

资源查找行为

静态资源:

    1.先查找使用该资源的元素的Resources字典。

    2.再查找上级元素的Resources字典,直到根元素。

    3.最后查找Application中的Resources字典。

动态资源:

    1.查找使用该资源的元素的Resources字典。

    2.查找上级元素的Resources字典,直到根元素。

    3.查找Application中的Resources字典。

    4.查找当前激活的Theme的Resources字典。

    5.查找系统资源。

感谢阅读,敬请斧正。

版权声明:本文由不落阁原创出品,转载请注明出处!

本文链接:http://www.leo96.com/article/detail/51

来说两句吧

该文章已禁止评论

最新评论

暂无评论,大侠不妨来一发?