在Avalonia中,颜色和画刷属于资源(Resources),不是样式(Styles),必须定义在
ResourceDictionary里,并通过
StaticResource或
DynamicResource引用。不能写在
Styles块或样式文件中,否则会编译报错。
颜色和画刷要放在资源字典里
资源字典可以是独立文件(如
Colors.axaml),也可以直接嵌入到
App.xaml、
Window.xaml等的
Resources节内。关键点是:每个资源必须有
x:Key,且类型要匹配。
SolidColorBrush用
Color构造,或直接绑定已定义的
Color资源
Color资源可单独定义,便于复用和主题切换 支持
GradientBrush、
ImageBrush等,写法类似
示例(
Colors.axaml):
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="PrimaryColor">#FF5494E2</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource PrimaryColor}"/>
<SolidColorBrush x:Key="TextBrush" Color="#FF333333"/>
<LinearGradientBrush x:Key="HeaderGradient" StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="#FFEEEEEE"/>
<GradientStop Offset="1" Color="#FFDDDDDD"/>
</LinearGradientBrush>
</ResourceDictionary>
在XAML中引用资源
只要资源字典已加载(通过
MergedDictionaries或直接嵌入),就可以在任意控件属性中用
{StaticResource KeyName}引用。
Background、
Foreground、
BorderBrush等属性都支持画刷资源
Color资源一般不直接用于控件属性,而是作为画刷的输入,或用于转换器参数 若需随系统主题动态更新,改用
{ThemeResource KeyName}(需配合ThemeDictionaries)
例如:
<TextBlock Text="标题" Foreground="{StaticResource TextBrush}" />
<Border Background="{StaticResource HeaderGradient}" />
<Button Background="{StaticResource PrimaryBrush}" Content="确定" />
合并资源字典的两种常用方式
资源字典需要被“引入”才生效。推荐集中管理,比如在
App.xaml中统一合并: 直接合并(立即加载):
<resourcedictionary.mergeddictionaries><resourcedictionary source="/Styles/Colors.axaml"></resourcedictionary></resourcedictionary.mergeddictionaries>延迟加载(按需):用
<resourceinclude source="..." x:key="MyColors"></resourceinclude>,之后在代码中手动取出来赋值给
MergedDictionaries
注意路径写法:
/Styles/Colors.axaml表示项目根目录下的相对路径;
avares://AppName/...用于程序集内嵌资源。
配合主题自动切换颜色
如果希望颜色随亮色/暗色主题变化,要用
ThemeDictionaries,而不是普通资源字典:
<SolidColorBrush x:Key="AccentBrush">
<SolidColorBrush.ThemeDictionaries>
<ResourceDictionary Theme="Light">
<SolidColorBrush x:Key="AccentBrush" Color="#FF5494E2"/>
</ResourceDictionary>
<ResourceDictionary Theme="Dark">
<SolidColorBrush x:Key="AccentBrush" Color="#FF3A7EBF"/>
</ResourceDictionary>
</SolidColorBrush.ThemeDictionaries>
</SolidColorBrush>
这样在
{StaticResource AccentBrush}处引用时,Avalonia会根据当前主题自动选对应版本。
基本上就这些。资源定义要规范,引用要匹配作用域,主题适配靠
ThemeDictionaries,不复杂但容易忽略层级和键名一致性。
