当前位置: 首页 > backend >正文

WPF中的静态资源和动态资源

WPF中动态静态资源(StaticResource)与资源(DynamicResource)详解

一、核心区别
特性静态资源(StaticResource)动态资源(DynamicResource)
解析时机编译时解析(首次加载时确定值)运行时解析(首次使用时才确定值)
更新机制资源变化后,引用不会更新资源变化后,引用会自动更新
性能略高(仅解析一次)略低(运行时需维护引用关系)
适用场景资源固定不变(如基础样式、固定图片)资源可能动态变化(如主题切换、多语言)
二、经典示例

下面通过一个“主题切换”场景,直观展示两者的区别:

1. 定义资源字典(主题资源)

先创建两个资源字典(浅色/深色主题),存储颜色资源:

LightTheme.xaml(浅色主题):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><SolidColorBrush x:Key="BgColor" Color="White"/><SolidColorBrush x:Key="TextColor" Color="Black"/>
</ResourceDictionary>

DarkTheme.xaml(深色主题):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><SolidColorBrush x:Key="BgColor" Color="Gray"/><SolidColorBrush x:Key="TextColor" Color="White"/>
</ResourceDictionary>
2. 主窗口XAML(引用资源)

在窗口中分别用静态资源和动态资源引用主题颜色,并添加切换按钮:

<Window x:Class="ResourceDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="资源示例" Height="300" Width="400"><!-- 初始加载浅色主题 --><Window.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="LightTheme.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Window.Resources><StackPanel Margin="20"><!-- 静态资源引用(不会随主题变化) --><TextBlock Text="静态资源文本" Foreground="{StaticResource TextColor}" FontSize="16" Margin="5"/><!-- 动态资源引用(会随主题变化) --><TextBlock Text="动态资源文本" Foreground="{DynamicResource TextColor}" FontSize="16" Margin="5"/><!-- 背景色用动态资源(方便观察整体变化) --><StackPanel Background="{DynamicResource BgColor}" Padding="10" Margin="5"><Button Content="切换到深色主题" Click="SwitchToDarkTheme" Margin="5"/><Button Content="切换到浅色主题" Click="SwitchToLightTheme" Margin="5"/></StackPanel></StackPanel>
</Window>
3. 后台代码(切换主题)

通过替换资源字典实现主题切换:

using System.Windows;namespace ResourceDemo
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}// 切换到深色主题private void SwitchToDarkTheme(object sender, RoutedEventArgs e){UpdateTheme("DarkTheme.xaml");}// 切换到浅色主题private void SwitchToLightTheme(object sender, RoutedEventArgs e){UpdateTheme("LightTheme.xaml");}// 更新资源字典private void UpdateTheme(string themePath){// 清除现有主题资源Resources.MergedDictionaries.Clear();// 加载新主题Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri(themePath, UriKind.Relative) });}}
}
三、运行效果
  • 初始状态:两个文本均为黑色(浅色主题)。
  • 点击“切换到深色主题”:
    • 静态资源文本:仍为黑色(未更新)。
    • 动态资源文本:变为白色(随资源更新)。
    • 背景色变为灰色(动态资源生效)。
  • 切换回浅色主题时,动态资源文本和背景色会再次更新,静态资源文本保持不变。
四、关键结论
  1. 静态资源适合引用不会变化的资源(如固定样式、图标),性能更优。
  2. 动态资源适合引用可能动态修改的资源(如主题、多语言字符串),但会有轻微性能开销。
  3. 实际开发中,优先用静态资源,仅在需要动态更新时使用动态资源。
http://www.xdnf.cn/news/19651.html

相关文章:

  • 支付系统设计模式应用:从单例到观察者模式实践
  • 网络编程 05:UDP 连接,UDP 与 TCP 的区别,实现 UDP 消息发送和接收,通过 URL 下载资源
  • EPLAN 分散式端子:提升原理图设计效率的实用功能
  • 使用 C 模仿 C++ 模板的拙劣方法
  • Replit在线编程工具:支持多语言环境免配置与实时协作,助力编程学习调试与社区项目复用
  • 企业微信员工聊天记录能看吗?合规管理三要素一次性说清
  • cuDNN深度解析:实战演练
  • Electron 菜单与托盘:构建用户友好的界面元素
  • 9月2日
  • 深入分析 json2(新)与标准的 jsonrpc的区别
  • zephyr设备树的硬件描述转换为c语言
  • Hash 算法 SHA-1、SHA-256、SHA-384、SHA-512 对比
  • SpringBoot3 + Netty + Vue3 实现消息推送(最新)
  • 食品分类案例
  • 码住!辉芒微MCU型号规则详细解析
  • Kafka 架构详解
  • 动子注册操作【2025.9.2学习记录】
  • MVP架构深层剖析-从六大设计原则的实现角度到用依赖注入深度解耦
  • Elasticsearch 核心知识与常见问题解析
  • MCU上跑AI—实时目标检测算法探索
  • 【 HarmonyOS 6 】HarmonyOS智能体开发实战:Function组件和智能体创建
  • 空间不足将docker挂载到其他位置
  • 03_网关ip和端口映射(路由器转发)操作和原理
  • 梯度消失问题:深度学习中的「记忆衰退」困境与解决方案
  • React 学习笔记4 Diffing/脚手架
  • 2025了,你知道electron-vite吗?
  • 网络原理——HTTP/HTTPS
  • ImageMagick命令行图片工具:批量实现格式转换与压缩,支持水印添加及GIF动态图合成
  • 2条命令,5秒安装,1秒启动!Vite项目保姆级上手指南
  • 鸿蒙NEXT界面交互全解析:弹出框、菜单、气泡提示与模态页面的实战指南