在Avalonia应用开发过程中,资源引用是实现样式复用、主题切换等功能的基础,DynamicResource和StaticResource是两种核心的资源引用方式,二者在使用逻辑和适用场景上有明显区别。

两种资源引用的基础概念
StaticResource是静态资源引用,它在应用加载时就会完成资源的解析和赋值,后续资源本身发生变化时,引用位置不会自动更新。DynamicResource是动态资源引用,它不会在加载时立即解析资源,而是会在资源发生变化时自动更新引用位置的值,适合需要动态变化的场景。
资源的定义方式
无论是StaticResource还是DynamicResource,引用的资源都需要先定义在资源字典中,常见的定义位置包括应用级资源字典、页面级资源字典或者控件级资源字典。以下是一个应用级资源字典的定义示例,在App.axaml中定义基础颜色和字体资源:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaResourceDemo.App">
<Application.Styles>
<StyleInclude Source="avares://Avalonia.Themes.Fluent/FluentTheme.axaml" />
</Application.Styles>
<Application.Resources>
<SolidColorBrush x:Key="PrimaryBrush">#2196F3</SolidColorBrush>
<SolidColorBrush x:Key="SecondaryBrush">#FF4081</SolidColorBrush>
<x:Double x:Key="TitleFontSize">24</x:Double>
<x:Double x:Key="ContentFontSize">16</x:Double>
</Application.Resources>
</Application>
StaticResource的使用方法
StaticResource通过{StaticResource 资源Key}的语法进行引用,适合引用不会频繁变化的资源,比如固定的颜色、字体大小等。以下是一个在窗口中引用静态资源的示例:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AvaloniaResourceDemo"
x:Class="AvaloniaResourceDemo.MainWindow"
Title="MainWindow"
Width="400"
Height="300">
<StackPanel Margin="20" Spacing="15">
<TextBlock Text="静态资源示例标题"
FontSize="{StaticResource TitleFontSize}"
Foreground="{StaticResource PrimaryBrush}" />
<TextBlock Text="这是使用StaticResource引用的内容文本"
FontSize="{StaticResource ContentFontSize}"
Foreground="{StaticResource SecondaryBrush}" />
</StackPanel>
</Window>
如果在应用运行过程中修改了PrimaryBrush的颜色值,上述TextBlock的前景色不会自动更新,因为StaticResource在窗口加载时已经完成了解析。
DynamicResource的使用方法
DynamicResource通过{DynamicResource 资源Key}的语法进行引用,适合引用可能动态变化的资源,比如主题切换时的颜色、动态修改的样式等。以下是使用DynamicResource的示例,同时添加按钮用于动态修改资源值:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AvaloniaResourceDemo"
x:Class="AvaloniaResourceDemo.MainWindow"
Title="MainWindow"
Width="400"
Height="300">
<StackPanel Margin="20" Spacing="15">
<TextBlock Text="动态资源示例标题"
FontSize="{DynamicResource TitleFontSize}"
Foreground="{DynamicResource PrimaryBrush}" />
<TextBlock Text="这是使用DynamicResource引用的内容文本"
FontSize="{DynamicResource ContentFontSize}"
Foreground="{DynamicResource SecondaryBrush}" />
<Button Content="切换主题颜色"
Click="OnSwitchThemeClick"
HorizontalAlignment="Center" />
</StackPanel>
</Window>
对应的后台代码中修改资源值的逻辑如下:
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
using System;
namespace AvaloniaResourceDemo
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnSwitchThemeClick(object? sender, EventArgs e)
{
// 获取应用级资源字典
var appResources = Application.Current?.Resources;
if (appResources == null) return;
// 切换PrimaryBrush的颜色
var currentBrush = appResources["PrimaryBrush"] as SolidColorBrush;
if (currentBrush?.Color == Color.Parse("#2196F3"))
{
appResources["PrimaryBrush"] = new SolidColorBrush(Color.Parse("#4CAF50"));
}
else
{
appResources["PrimaryBrush"] = new SolidColorBrush(Color.Parse("#2196F3"));
}
}
}
}
点击按钮后,使用DynamicResource引用的TextBlock的前景色会自动更新,而如果使用StaticResource引用的对应元素则不会变化。
两者的核心差异对比
为了更清晰地区分两种引用方式,以下是核心差异的对比:
| 对比维度 | StaticResource | DynamicResource |
|---|---|---|
| 解析时机 | 应用加载时解析 | 运行时动态解析,资源变化时重新解析 |
| 资源更新响应 | 不响应资源变化 | 自动响应资源变化并更新 |
| 性能开销 | 开销更低 | 开销稍高,需要监听资源变化 |
| 适用场景 | 固定不变的资源,如基础字体、固定颜色 | 动态变化的资源,如主题颜色、动态样式 |
使用注意事项
- 引用资源时必须保证对应的Key在资源字典中存在,否则会抛出资源找不到的异常。
- 不要在性能敏感的频繁更新场景滥用DynamicResource,避免不必要的性能开销。
- 如果资源定义在控件级资源字典中,DynamicResource只能响应当前控件及子控件范围内的资源变化。
- StaticResource不能引用比它自身定义位置更靠后的资源,而DynamicResource没有这个限制。
AvaloniaDynamicResourceStaticResource资源引用修改时间:2026-07-09 22:18:28