二、资源
定义:资源就是类型实例化之后的对象。
每一个控件都有一个Resources属性,该属性存储了一个资源字典集合。
2.1资源查找顺序和作用范围
| 位置 | 作用范围 | 示例 |
|---|---|---|
Application.Resources(App.xaml) | 全局 | 所有窗口 |
Window.Resources | 当前窗口 | 仅该 Window 内控件 |
UserControl.Resources | 当前用户控件 | 仅该 UserControl 内 |
控件的Resources(如 Grid.Resources) | 局部 | 仅子元素可见 |
资源查找顺序:控件自身 → 父容器 → Window → Application → 系统默认。
2.2静态资源和动态资源
只是控件的使用方式不同,静态资源只在运行时加载一次,动态资源随资源改变而改变
示例:
<Window.Resources> <SolidColorBrush x:Key="aaa" Color="Red"></SolidColorBrush> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button Background="{StaticResource aaa}" >111</Button> <Button Background="{DynamicResource aaa}" Grid.Row="1" Click="Button_Click">111</Button> </Grid>cs文件:
改变资源aaa对应的值,动态资源更新,静态资源不变
private void Button_Click(object sender, RoutedEventArgs e) { this.Resources["aaa"]= new SolidColorBrush(Colors.Yellow); }2.3资源管理形式
2.3.1窗口中直接定义
这里Resources中的内容以键对值形式加入,但是实际上形成了一个字典
<Window.Resources> <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#2bb6fe" /> <Style TargetType="Button"> <Setter Property="Background" Value="AliceBlue"/> </Style> </Window.Resources>2.3.2appxaml中定义
和窗口一样的写法,只是作用域发生改变
<Application.Resources> <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#2bb6fe" /> <Style TargetType="Button"> <Setter Property="Background" Value="AliceBlue"/> </Style> </Application.Resources>2.3.3资源字典
引入
<Window.Resources> //这里的Resources属性本身就是ResourceDictionary类的引用类型,这里相当于传给他一个对象 <ResourceDictionary> //mergedDictionaries是一个connect集合,多个集合合并时相同只保留一个 <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Dictionary1.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>定义
项目右键创建资源字典
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="aaa" Color="Red"></SolidColorBrush> </ResourceDictionary>资源字典的合并
- 在
MergedDictionaries集合中,当多个被合并的字典定义了相同的资源键(x:Key)时,最后被加入的字典中的资源生效 - 在同一个
ResourceDictionary中,直接定义的本地资源(内联资源)优先级高于所有通过MergedDictionaries合并进来的资源
样式(style)
TargetType属性:这是一个类类型,也就是一个反射,这个属性指明了当前样式要作用于哪种类型的控件上。因为WPF中有许多的控件,我们定义一个样式时,必须要指明这个样式的“适用范围”。
BasedOn属性:样式也有继承的概念,所以,BasedOn指明了当前样式继承于哪个样式
Triggers属性:这是一个集合属性,表示触发器的定义,当满足某些条件时,触发哪些行为,以使控件达到一定的“节目效果”。比如当鼠标移上去时,控件的背景颜色变成红色。这些的效果就可以通过定义控件的触发器来设置。
Setters属性:这也是一个集合属性,样式是控件属性的值的“提前设置”,所以,我们对控件属性的值的设置都是以Setter条目的形式,一条一条的放到这个Setters集合中。
Setter的使用
<Style TargetType="TextBox"> <Setter Property="BorderBrush" Value="#CCC" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="Padding" Value="4,2" /> <Setter Property="MinHeight" Value="24" /> </Style>TargetType与BasedOn的使用
<!-- 基样式:隐式 --> <Style TargetType="Button"> <Setter Property="Padding" Value="8,4" /> <Setter Property="MinHeight" Value="28" /> <Setter Property="Background" Value="White" /> <Setter Property="BorderBrush" Value="#999" /> </Style> <!-- 变体 1:继承隐式样式,只改差异 --> <Style x:Key="ToolbarButton" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> <Setter Property="FontSize" Value="11" /> <Setter Property="Padding" Value="4,2" /> <Setter Property="MinHeight" Value="26" /> </Style> <!-- 变体 2:继承 ToolbarButton,再加橙色 --> <Style x:Key="AccentButton" TargetType="Button" BasedOn="{StaticResource ToolbarButton}"> <Setter Property="Background" Value="#F5A623" /> <Setter Property="BorderBrush" Value="#D48806" /> </Style>应用样式
<Button Margin="5,0,0,0" Content="清空" Style="{StaticResource ToolbarButton}" />(1) Property Trigger(属性触发器)
<Style TargetType="Button"> <Setter Property="Background" Value="LightGray" /> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Yellow" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="Red" /> </Trigger> </Style.Triggers> </Style>(2) DataTrigger(数据触发器)
根据绑定数据值改变样式:
<Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding IsImportant}" Value="True"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="Foreground" Value="Red" /> </DataTrigger> </Style.Triggers> </Style>(3) EventTrigger(事件触发器,常用于动画)
<Style TargetType="Button"> <Style.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.2" Duration="0:0:0.3" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Style.Triggers> </Style>原文链接:https://www.cnblogs.com/tlnshuju/p/19433520
一、Pack URL(路径)
Pack URI(Pack Uniform Resource Identifier)用于统一标识和定位资源的 URI 方案
📌核心作用:
让你用一种标准方式引用:
- 当前程序集中的资源(如图片、样式、XAML)
- 其他程序集(DLL)中的资源
- 应用程序安装目录下的外部文件
📌规定:
- 必须使用正斜杠/
1.1Application Data URI(嵌入资源)
pack://application:,,,/程序集名称;component/资源路径- 如果省略程序集名称,表示当前程序集。
component是关键字,表示资源在程序集内部,当前程序集可省略。
1.1.1当前程序集中的资源(最常见)
示例-项目结构:
1MyApp/ 2├── App.xaml 3└── Assets/Images/logo.png简略写法(最常用)
- 所有以
/开头的相对 URI 在 WPF 中都会被自动解释为pack://application:,,,/ - /作用是回到根目录
/Assets/Images/logo.png完整写法
pack://application:,,,/Assets/Images/logo.png1.1.2其他程序集(类库)中的资源
示例:
类库名:MyLibrary
资源路径:Themes/Generic.xaml
- 简写形式(仍需保留
;component):uriMyLibrary;component/Themes/Generic.xaml - 完整写法
pack://application:,,,/MyLibrary;component/Themes/Generic.xaml1.2Site of Origin URI(松散文件)
用于访问未嵌入程序集、而是放在应用程序部署目录(如bin\Debug或安装目录)中的文件。
1. 语法(无简写!)
pack://siteoforigin:,,,/相对路径2. 示例
假设你的应用安装在C:\MyApp\,目录下有:
1C:\MyApp\ 2├── MyApp.exe 3└── Data/config.jsonUri uri = new Uri("pack://siteoforigin:,,,/Data/config.json");⚠️ 注意:
- 不能简写(不能写成
/Data/config.json,那会被当作嵌入资源)- 文件必须存在且 Build Action =
None或Content(并复制到输出目录)