资源的简介
- 抽取公用的配置属性,一个地方定义可多个地方使用
- 方便用户编辑,减少XAML中的代码量
- 资源可以在各个层级中定义,使用Resources类来进行定义,必须定义唯一键
资源与程序集资源不相同,前者可编码实现,后者代表一些二重要的文件,图片,音视频文件等。
资源的分类
静态资源 StaticResource
静态资源只在资源集合中获取一次资源,以后无论该资源是否变化都不影响已经应用的静态资源类型
- 适合静态资源的场景
- 应用程序资源集中到页或应用程序级别的资源字典中,静态资源引用不会基于运行时行为(例如重新加载页)进行重新求值,因此,根据您的资源和应用程序设计避免大量不必要的动态资源引用
- 设置不在 DependencyObject) 或 Freezable) 上的属性的值
- 创建将编译为 DLL 并打包为应用程序的一部分或在应用程序之间共享的资源字典
- 使用资源来设置大量依赖项属性
- 为所有使用者更改基础资源,或者需要通过使用 x:Shared 特性)为每个使用者维护独立的可写实例
- 静态资源查找行为
- 在由设置属性的元素定义的资源字典中查找所请求的键。
- 查找过程向上遍历逻辑树,直到到达父元素及其资源字典为止
检查应用程序资源。 应用程序资源是 Application) 对象为您的 WPF 应用程序定义的资源字典中的资源。
动态资源
动态资源每次查找时,都会到资源池里面进行查找,资源值会动态变化
- 适用动态资源的场景
- 资源的值取决于直到运行时才知道的情况
- 您正在为自定义控件创建或引用主题样式
- 在应用程序生存期调整 ResourceDictionary) 的内容
- 您有一个存在依存关系的复杂资源结构,在这种情况下,可能需要前向引用。
- 从编译或工作集角度来说,您引用的资源特别大,并且加载页时可能无法立即使用该资源。
- 您要创建的样式的 setter 值可能来自受主题或其他用户设置影响的其他值。
- 您正在将资源应用到元素,而在应用程序生存期中可能会在逻辑树中重新设置该元素的父级
- 动态资源的查找行为
- 查找过程在由设置属性的元素定义的资源字典中查找所请求的键。
- 如果该元素定义一个 Style) 属性,则检查 Style) 中的 Resources) 字典。
- 如果该元素定义一个 Template) 属性,则检查 FrameworkTemplate) 中的 Resources) 字典。
- 查找过程向上遍历逻辑树,直到到达父元素及其资源字典为止
- 检查应用程序资源。 应用程序资源是 Application) 对象为您的 WPF 应用程序定义的资源字典中的资源
- 对于当前活动的主题,检查主题资源字典。
-
资源字典
创建字典资源 ```csharp <ResourceDictionary xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation“
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
1. 使用资源字典
```csharp
<Window.Resources>
<ResourceDictionary Source="/CustomerResoucers/Test.xaml">
</ResourceDictionary>
</Window.Resources>
<Grid>
<TextBlock Background="{StaticResource test}"></TextBlock>
</Grid>
- 使用其他程序集的资源字典
- MergedDictionaries 所返回的资源将来自在 MergedDictionaries) 集合中最后一个找到的字典。
- 通过source可以应用不同应用程序集中资源信息
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="Blue" SecondaryColor="LightBlue" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />// 引用第三方的资源信息
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/JHT.XYYLClient;component/style/FontStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>