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>
在上面代码中我们定义如下资源:
- SolidColorBrush表示一把刷子,可以对控件进行绘制
- 两个Style样式器,Setter表示选择器,Property表示属性名称、Value表示属性值
- 一个字符串对象以及一个数字对象,需要引用如下命名空间
xmlns:sys="clr-namespace:System;assembly=mscorlib" - 第一种不指定键的两种写法
TargetType="Border"和TargetType="{x:Type Border}" 框架会将样式自动应用到目标对象 - 第二种需要指定键的两种写法
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): 可视化树是逻辑树的一种扩展,逻辑树的每个结点都被分解为核心视觉组件,逻辑树节点对我们来说是个黑箱,而视觉树暴露了视觉的实现细节
![](/i/l/?n=23&i=blog/1101861/202302/1101861-20230206205018011-1530112779.png)
标签:03,逻辑,Resource,定义,控件,查找,Resources,WPF,资源 From: https://www.cnblogs.com/axzxs2001/p/17096680.html