Avalonia 学习之 资源使用
通常,样式和控件需要共享资源,例如(但不限于)画笔和颜色。您可以将此类资源房子每个样式和控件上可用的资源字典中,然后在其他地方引用这些资源。
声明资源
如果资源可供整个应用程序使用,则可以在App.axaml中定义它:
<Application.Resources>
<SolidColorBrush x:Key="Warning"
Color="Yellow" />
<SolidColorBrush x:Key="Success"
Color="Green" />
</Application.Resources>
或者,您可以在窗口或用户控件上声明资源:该资源将可用于窗口/用户控件 及其子项:
<Window.Resources>
<SolidColorBrush x:Key="Error" Color="Red" />
</Window.Resources>
或者在控件中声明资源
<StackPanel.Resources>
<SolidColorBrush x:Key="Fail" Color="Orange" />
</StackPanel.Resources>
最常用的应该是单独抽离出来一个资源字典的文件
添加新建项的时候,选择 Resource Dictionary(Avalonia)
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Add Resources Here -->
<SolidColorBrush x:Key="Error" Color="Red" />
</ResourceDictionary>
引用资源
这个跟wpf使用方式是一样的,可以通过{DynmaicResource} 或 {StaticResource} 标记扩展引用资源,例如:
<Border Background="{DynamicResource Error}"/>
<Border Background="{StaticResource Fail}"/>
StaticResource 相比较与 DynamicResource
- 它不会响应资源中的更改
- 资源需要在同一XAML文件中生命
只是引入方式的区别,跟资源本身没啥关系。
静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了;
动态资源(DynamicResource)使用指的是在程序运行过程中然会去访问资源。
合并的资源字典
每个控件和样式上的Resource属性的类型未ResourceDictionary. 资源字典还可以通过使用
ResourceDictionary.MergedDictionaries属性来包含其他资源字典。要将资源字典包含在另一个资源字典中,您可以使用ResourceInclude类,例如:
窗体中引入资源
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="/Resources/BaseResource.axaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
全局引入资源
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="/UserControls/Geometries.axaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
主题资源
主题通常会将画笔、颜色和其他设置定义为资源。通过更改这些资源,例如可以从深色主题切换到浅色主题。具体实现可以参考 https://blog.csdn.net/mzl87/article/details/128067217 。
控件模板资源
TemplatedControl 控件最适合用于可在各种应用程序之间共享的泛型控件。它们是外观控件。这意味着它们可以针对不同的主题和应用程序设计样式。
比如
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:CustomWindowDemo.Controls">
<!-- Add Resources Here -->
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="/UserControls/Geometries.axaml"/>
<ResourceDictionary>
<ControlTemplate x:Key="Default"
TargetType="controls:SystemDecorationControl">
。。。。
</ControlTemplate>
<ControlTemplate x:Key="Light"
TargetType="controls:SystemDecorationControl">
。。。
</ControlTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
这样我们就有了针对SystemDecorationControl控件的俩个模板资源,使用的时候 ,可以通过Template 来选择不同的模板资源
<uc:SystemDecorationControl Template="{StaticResource Default}" />
详细使用方式,在写控件模板的时候再细说吧。