Avalonia UI 中 Styles 与 ControlTheme 的区别

目录

介绍

在 Avalonia UI 中有几种概念 Theme Style ControlTheme,从WPF转过来的时候对于 ControlTheme 跟 Theme 的区别是什么呢? 为什么Style跟我们的WPF的Style的效果不太一样? Trigger 也没了?

首选需要说的是, ThemeStyleControlTheme 都是继承自 IStyle 也就是说他们都是 样式(Style), 但是他们之间有一些差异.

这里介绍一下我个人如何理解这三种 IStyle

  1. Theme 暂且理解为 全局主题(Global Theme)
  2. Style 暂且理解为 局部主题(Local Theme)
  3. ControlTheme 暂且理解为 控件样式 (Control Style, 类似WPF中定义控件Style以及Template)

使用方式

全局主题 (Global Theme)

// App.xaml
<Application xmlns="https://github.com/avaloniaui"
             RequestedThemeVariant="Default">
             <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
    <Application.Styles>
        <FluentTheme />     // 这里的Theme 其实也是Style
    </Application.Styles>
</Application>

局部主题 (Local Theme)

如果将 Style 方式在 Window或者UserControl或者Control下即为局部主题

<Window>
    <Window.Styles>
        <!-- Common button properties -->
        <Style Selector="Button">
            <Setter Property="Margin" Value="10" />
            <Setter Property="MinWidth" Value="200" />
            <Setter Property="Height" Value="50" />
			<Setter Property="HorizontalContentAlignment" Value="Right" />
			<Setter Property="VerticalContentAlignment" Value="Bottom" />
			<Style Selector="^:pointerover /template/ ContentPresenter">
				<Setter Property="Background" Value="Green" />
			</Style>
        </Style>
    </Window.Styles>

    // ...
</Window>

控件主题 (ControlTheme)

注意: 这里的 ControlTheme 是放置在 Window.Resource

<Window.Resource>
    <ControlTheme x:Key="{x:Type Button}" TargetType="Button">
        <Setter Property="Background" Value="#C3C3C3" />
        <Setter Property="FontFamily" Value="Arial" />
        <Setter Property="FontSize" Value="14" />
        <Setter Property="Height" Value="100" />
        <Setter Property="Template">
            <ControlTemplate>
                // ... 
            </ControlTemplate>
        </Setter>
        <Style Selector="^:pointerover">
            <Setter Property="Background" Value="red" />
        </Style>
    </ControlTheme>
</Window.Resource>

问题描述

从使用方式上看 Global ThemeLocal Theme 是一样的, 都是放置在 Styles 属性下. 问题的关键是:

  1. Styles 下的 ThemeResource下的ControlTheme有什么区别?

  2. StylesControlTheme 同样可以重写 Template, 那我要选哪个来重写 Template?

问题分析

在下文我将 Styles下的ThemeStyle称为 Styles, 将Resources下的ControlTheme成为ControlTheme, 方便大家理解.

问题1 区别

按我个人的理解来看,这是属于两种UI设计模式.

  • Styles 类似于 CSS 样式表操作,针对在应用范围内的所有选择的元素的 Style 都将被应用.

  • ControlTheme 是类似与 WPF 的 Style, 除了默认ControlTheme, 其他ControlTheme都需要指定Key,相对独立。

问题2 重写TemplateStyles 还是 ControlTheme?

两种模式都可以写, ControlTheme 是从 v11 版本引入的. 主要是为了解决 Styles 之间的隔离性. 如:

 <Style Selector="Button">   // Default Style
    <Setter Property="HorizontalContentAlignment" Value="Right" />
    <Setter Property="VerticalContentAlignment" Value="Bottom" />
 </Style>
 // 两个Button的Style有关联关系
 <Style Selector="Button.NewStyle"> // 对 Default Style 的修改都有可能影响其他Style
    <Setter Property="HorizontalContentAlignment" Value="Left" /> 
    // <Setter Property="VerticalAlignment" Value="Bottom" />    // 来此Default Style
 </Style>

试想这样一个场景, 如果我在代码中引入了第三方控件库,它重写了系统默认控件的样式, 这个时候我们又有自己的样式, 如

// 第三方库
 <Style Selector="Button"> 
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="MinWidth" Value="100" />
 </Style>

// 我们自己的 
 <Style Selector="Button">   
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="VerticalContentAlignment" Value="Bottom" />
    <Setter Property="Width" Value="50" />
 </Style>

引用自官网: 如果你想要修改控件的特定实例的样式Styles,唯一的选项是应用一个新的Styles为控件实例,并希望它能够重写原始的Styles中的设置过的所有属性.

以上的场景 Button 的宽度是多少? 答 100. 这个对于来自WPF的小朋友就感觉就难受了, 第三方库加了个MinWidth,我又没继承,难道我还要在自己的样式中自己给MinWidth或者重新整个样式吗? 也就是Avalonia UI官方说的一旦一个Style被应用到一个控件上,没有办法移除它

坑就来了啊,如果第三方库更新了Styles加了个属性咋办? 我也要跟着加?

使用 ControlTheme

所以 V11 版本后引入了 ControlTheme 对于 特定 ControlControlTheme之间是彼此独立的。

<ControlTheme x:Key="A" TargetType="Button">
   <Setter Property="VerticalContentAlignment" Value="Center" />
   <Setter Property="HorizontalContentAlignment" Value="Center" />
   <Setter Property="MinWidth" Value="100" />
</ControlTheme>
// 两个Button的ControlTheme相互独立
<ControlTheme x:Key="B" TargetType="Button">
   <Setter Property="HorizontalContentAlignment" Value="Left" />
   <Setter Property="VerticalContentAlignment" Value="Bottom" />
   <Setter Property="Width" Value="50" />
</ControlTheme>

问: Button的宽度是多少? 答 50. 这不就跟我们大WPF一样了吗? 如果我还要继承第三方库写的样式咋办? 加上 Baseon 属性即可.

最佳实践

  1. 开发UI框架时最好使用 ControlTheme 定义控件 Template, 这也是官方推荐的。
  2. 利用控件可以应用多个Styles的优点,标准化一些常用样式, 供控件的扩展UI使用
  3. 利用 Styles 应用优先级比 ControlTheme 高的优点,
    1. 标准业务里边的多颜色主题使用Styles
    2. 全局控制应用的主题
  4. 不要写默认的全局Style<Style Selector="Button">, 否则所有Button都将受到影响, 官方全局样式里边的已经都替换成ControlTheme了, 有兴趣参考下面链接。

总结

Style & ControlTheme 的特性

独立性

ControlTheme 彼此之间是独立的
Style 彼此是相互覆盖的

如:

<ControlTheme x:Key="A" TargetType="Button">
   //...
</ControlTheme>
// 两个Button的ControlTheme相互独立
<ControlTheme x:Key="B" TargetType="Button">
   //...
</ControlTheme>
<Style Selector="Button">   // Default Style
   <Setter Property="HorizontalContentAlignment" Value="Right" />
   <Setter Property="VerticalContentAlignment" Value="Bottom" />
</Style>
// 两个Button的Style有关联关系
<Style Selector="Button.NewStyle"> // 对 Default Style 的修改都有可能影响其他Style
   <Setter Property="HorizontalContentAlignment" Value="Left" /> 
   // <Setter Property="VerticalAlignment" Value="Bottom" />    // 来此Default Style
</Style>

继承性

ControlTheme 由于ControlTheme之间相互独立,但是其支持 BaseOn 类似 WPF 的<Style BaseOn="{StaticResource BaseStyle}"
Style 参考上一点独立性, 新增的Style都将继承Default Style

如:

<ControlTheme x:Key="A" TargetType="Button">
   //...
</ControlTheme>
// 两个Button的ControlTheme相互独立
<ControlTheme x:Key="B" TargetType="Button" BaseOn="{StaticResource A}">
   //...
</ControlTheme>

Styles 类似 CSS, 它将所有作用域范围内的StylesSetters都放在一起应用到控件上. 这也就是为什么原始的Style如果新的Style不需要也要设置相同属性进行覆盖

优先级

从应用样式的角度 Style > ControlTheme 即 Default Style(或者设置了Classes的控件) 的 Setter 都将覆盖 ControlThemeSetter

从定义控件的角度 ControlTheme > Style 即 定义一类新Template(类似WPF的 ControlTemplate) 优先使用ControlTheme, 并且利用 Style 控制上层颜色方案

样式来源

ControlTheme 将遍历 可视树 (Visual Tree), 这种方式也与WPF类似

Style 类似于将所有作用域范围内的所有 Setter 合并并收集起来, 应用到控件实例上.

StylesControlTheme

控件实例可以引用多个Styles, 引用方式为 Classes="H1 Blue"

控件实例只可以引用一个ControlTheme, 引用方式为 Theme="{StaticResources XXXXTheme}"

参考文档

Control Themes

Styles

Button Themes

===

CC BY-NC-SA 4.0

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 0xJins包含此链接),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 首先,Avalonia是一种跨平台的UI框架,它可以在Windows,Max OS和Linux等平台上运行。但是Avalonia的文文档相对较少,这对于初学者来说可能会造成一些阻碍。 为了解决这一问题,Avalonia的开发团队已经着手制作文文档,并且正在不断更新完善。当前,Avalonia的文文档包括了官方文档和社区贡献的文档两部分。 官方文档,用户可以找到Avalonia的基本介绍、入门指南、UI控件、样式、数据绑定、模板等方面的详细介绍。此外,官方文档还提供了Avalonia的API文档和常见问题解答,方便用户进行深入学习和实践。 而社区贡献的文档则更加注重实践经验和案例分享,用户可以在社区找到一些由Avalonia爱好者分享的教程、演示和项目。这些文档不仅仅是学习资料,同时也帮助用户更好地理解Avalonia的实际应用和性能特点。 总体而言,Avalonia的文文档虽然相对不太完善,但是已经有一定的覆盖面和入门指南。在未来,随着Avalonia的不断发展和成熟,相信文文档也会越来越丰富和完善,为广大Avalonia用户提供更加优质的学习和实践体验。 ### 回答2: Avalonia是一个跨平台的图形化应用程序框架,提供了类似于WPF的XAML语言来定义UI,这个框架支持Windows、MacOS和Linux操作系统。对于国开发者来说,目前还没有及时、全面的文文档,但是随着Avalonia在国内的应用用户越来越多,国内社区也在逐渐增长,我们可以寻找一些相关资源来解决问题,例如英文官方文档、GitHub Wiki页面和社区文文档。 首先,可以通过Avalonia官方文档了解Avalonia的基础知识和API。官方文档提供了全面的Avalonia介绍、XAML入门指南、工具使用、自定义控件、布局、数据绑定、图像处理、动画和手势等方面的介绍。虽然是英文文档,但由于翻译质量较高,可作为使用Avalonia进行开发的主要参考。 其次,在GitHub上,Avalonia有一份用户可编辑的Wiki页面,内容涵盖了Avalonia的各个方面,包括教程、说明、示例代码和FAQ等。这些页面很容易被社区搜集并翻译成文,所以对于那些想要通过实践来掌握Avalonia或了解其他有人遇到的问题的开发者来说,Wiki是值得去查阅的资源。 最后,还可以参考一些国内社区写的文文档,例如CSDN、掘金和博客园等。这些文档质量和更新速度并不一定,但可以提供有价值的知识和解决方案。在国内社区出现的Avalonia相关讨论也可以提供一些有益的信息,开发者可以通过讨论和答疑来获取更多的知识。总的来说,可以多方查阅和了解Avalonia,不断提高自己的应用能力,这是我们需要做的。 ### 回答3: Avalonia是一种基于.NET Core的跨平台用户界面(XAML)框架,具有高度的可扩展性和性能,并且可以运行在Windows、MacOS、Linux等多种操作系统上。Avalonia的文文档提供了对于国用户更为友好的使用说明,让用户更容易掌握该框架的使用方法和技巧。 Avalonia的文文档内容涉及了框架的基本概念、应用开发流程、主要功能API、组件使用方法等,涵盖了从初学者到高级开发者的技术层次。文档的整体结构清晰、简明易懂,对于想要快速上手Avalonia框架的用户来说,非常实用。 此外,Avalonia的文社区规模不断扩大,社区成员参与到Avalonia框架的深入开发和优化,为文文档的完善和丰富作出了重要贡献。这也使得Avalonia框架在国内用户逐渐受到认可和应用,并且也促进了其在全球范围内的发展。 总之,Avalonia的文文档以用户为心,紧密配合框架的更新和丰富,为用户提供全面、系统的使用指导和帮助。Avalonia的文文档的质量在不断提升,也为用户提供了一个更好的使用体验和开发环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值