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

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

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

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

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

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

LightTheme.xaml(浅色主题):

xml 复制代码
<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(深色主题):

xml 复制代码
<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(引用资源)

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

xml 复制代码
<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. 后台代码(切换主题)

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

csharp 复制代码
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. 实际开发中,优先用静态资源,仅在需要动态更新时使用动态资源。
相关推荐
Aevget5 小时前
界面控件DevExpress WPF v25.1新版亮点:AI功能的全面升级
c#·.net·wpf·界面控件·devexpress·ui开发
beyond谚语1 天前
第一章 WPF概述
wpf
necessary6532 天前
从工行“余额归零”事件看CAP定理:当金融系统在一致性与可用性之间做出选择
分布式·金融·wpf·可用性测试
棉晗榜2 天前
WPF隐藏控件后,怎么让其上部的控件空间自动撑高
wpf
壹佰大多3 天前
【Redisson分布式锁源码分析-3】
数据结构·分布式·mysql·spring·spring cloud·wpf·lua
LateFrames3 天前
以小白视角尝试 WPF / WinUI3 / MAUI / MAUI Blazor 构建 Windows 桌面程序
windows·wpf·maui·mauiblazor·winui3
偶尔的鼠标人4 天前
Avalonia/WPF 打开子窗口,并且跨页面传值
c#·wpf·mvvm·avalonia
玖笙&4 天前
✨WPF编程进阶【6.1】:图形原则(附源码)
c++·c#·wpf·visual studio
lixy5794 天前
WPF检测网络状态切换
wpf
纸照片4 天前
WPF中为Button设置IsMouseOver和IsPressed事件中改变背景颜色不起作用
c#·.net·wpf