WPF-03 资源之Resources

WPF中有两种类型资源Static Resource、Dynamic Resource,资源本质上就是一个对象 。 这节我们主要介绍静态资源
Static Resource(静态资源)在第一次编译后就确定的值,之后不能修改。FrameworkElement类定义Resource属性,该属性是 ResourceDictionary字典类型, 你可以在该类的任何派生类定义资源,资源字典中的每个键必须是唯一,我们在定义资源时可以通过x:Key指令来分配唯一键。.
定义资源
<Window x:Class="Example_04.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:sys="clr-namespace:System;assembly=mscorlib"        xmlns:local="clr-namespace:Example_04"        mc:Ignorable="d"        Title="MainWindow" Height="450" Width="800">    <Window.Resources>        <SolidColorBrush x:Key="MyBrush" Color="#05E0E9"/>        <Style TargetType="Border">            <Setter Property="Background" Value="#4E1A3D" />            <Setter Property="BorderThickness" Value="5" />            <Setter Property="BorderBrush">                <Setter.Value>                    <LinearGradientBrush>                        <GradientStop Offset="0.0" Color="#4E1A3D"/>                        <GradientStop Offset="1.0" Color="Salmon"/>                    </LinearGradientBrush>                </Setter.Value>            </Setter>        </Style>        <Style TargetType="TextBlock" x:Key="lable">            <Setter Property="HorizontalAlignment" Value="Right"/>            <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>            <Setter Property="FontFamily" Value="Arial"/>        </Style>        <sys:String x:Key="str">字符创定义</sys:String>        <sys:Double x:Key="number">100.973</sys:Double>    </Window.Resources>    <Border>        <StackPanel>            <TextBlock Style="{StaticResource lable}" Text="{StaticResource str}"></TextBlock>            <TextBlock HorizontalAlignment="Right" FontSize="36" Margin="20" Text="Title">                <TextBlock.Foreground>                    <StaticResource ResourceKey="MyBrush"></StaticResource>                </TextBlock.Foreground>                <TextBlock.Width>                    <StaticResource ResourceKey="number"></StaticResource>                </TextBlock.Width>            </TextBlock>            <Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />        </StackPanel>    </Border></Window>
WPF-03 资源之Resources
 
在上面代码中我们定义如下资源:
  1. SolidColorBrush表示一把刷子,可以对控件进行绘制
  2. 两个Style样式器,Setter表示选择器,Property表示属性名称、Value表示属性值
  3. 一个字符串对象以及一个数字对象,需要引用如下命名空间
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
  4. 第一种不指定键的两种写法
     TargetType="Border"和TargetType="{x:Type Border}" 框架会将样式自动应用到目标对象
  5. 第二种需要指定键的两种写法 
    5.1 需要在控件中手动引用资源
            <Style TargetType="TextBlock" x:Key="lable">
   5.2 不需要在控件中手动引用资源
            <Style TargetType="TextBlock" x:Key="{x:Type TextBlock}">
我们也可以在资源中定义一些数据模板DataTemplate和控件模板ControlTemplate

使用资源

可以使用如下两种语法使用资源(参考上面代码已经覆盖这两种写法):

<!--第一种--><object property="{StaticResource key}" ... /><!--第二种--><object>    <object.property>       <StaticResource ResourceKey="key" ... />    </object.property>  </object>
查找资源
 
控件在查找资源时,先查找控件自己的Resource属性,如果没有找到,控件会沿着逻辑树向上一级进行查找,如果在当前页面的顶级UI元素的资源中没有找到,程序会查找<Application.Resources/>(也就是应用程序的顶级资源)。如果仍然没有找到,应用程序就会抛出异常

在这里引出两个概念:

逻辑树(Logical Tree):逻辑树是由每个控件的节点组成,本质上就是XAML文件中的UI元素
可视化树(Visual Tree):  可视化树是逻辑树的一种扩展,逻辑树的每个结点都被分解为核心视觉组件,逻辑树节点对我们来说是个黑箱,而视觉树暴露了视觉的实现细节。