样式

样式语法

样式的基本语法如下:

selector {
    // setter-property: setter-value;        // Use value.
    // setter-property: var(resource-key);   // Use dynamic resource.
    
    // Sample:
    Background: #0068B5;
    Foreground: var(Accent);
    
    // ...
    
    // Children must be at last of the style.
    [[
        ::animation{
            
        }
        child-style-selector {
            // ...
        }
        child-style-selector2 {
            // ...
        }
    ]]
}

和 Avalonia 的样式一样,Acss 样式可以嵌套,嵌套的样式放在 Children 当中,其语法为两对中括号 '[[ ... ]]'。Children 当中除了可以放子样式,还可以放动画。

Selector 语法

Acss 的样式选择器(Selector)的语法和 Avalonia 中完全一致。唯一区别在于子样式的 Selector 前面不需要添加 “^” 符号。

Setter 语法

Setter 放在样式当中的形式前面已经进行了展示。这里单独说明下其他特征。

  • Setter 中的冒号 “:” 前后的空白字符会影响语句效果。

  • Setter 的结束符 “;” 是必不可少的,但是集合属性不需要,或者最后一个 Setter 可省略。

  • Setter 的 Property 是大小写敏感的。

  • Setter 的 Value 可以使用动态资源。

  • Setter 的 Value 的解析和资源值解析语法一致。

  • Setter 的 Value 可以使用静态实例,使用 “@” 符号标记静态类型,后直接访问静态属性,例如:

  • Setter 的 集合类型的值定义有特殊的语法。例如对于 Transitions 属性,它是一个集合 。

样式的分类

Acss 的样式最终还是会生成 Avalonia 样式来产生效果。但是逻辑上我们仍然给它进行了分类。

这里讨论的是根样式,不包括样式内嵌套的子样式。

1. 主题子样式

主题子样式是针对某个类型的 Control 定义的子样式,其样式解析成 Avalonia 样式后,会在当前环境和 Application 范围内查找该类型 Control 的 ControlTheme,并将样式加入到该 ControlTheme 当中作为子样式存在。

这和你直接在 ControlTheme 中定义子样式别无二致。

如下三段代码中,在实际效果上,Code #1 + Code #2 = Code #3。

2. 普通样式

普通样式则是不带 “^” 符号的 Acss 样式,它会被解析为 Avalonia 样式后,放入 IAcssFile 的 Styles 当中。注意,IAcssFile 继承了 Avalonia 接口 IStyle。而 IAcssFile 则是在被 IAcssLoadr 加载时,放入加载时传入的 Styles 类型的 Owner 当中。

普通样式的示例如下:

3. 逻辑子样式(beta)

逻辑子样式不属于 Avalonia 现有支持的功能,它指的是,该样式将会被放入父样式的 Selector 的 Target 的 Styles 当中。

例如,“/template/Grid#PART_MonthView” 的 Target 是 Grid,逻辑子样式将会被放入 Grid 的 Styles 当中,作为普通的子样式存在。

逻辑子样式的 Selector 前需添加 “>” 符号,代码示例:

样式继承

不同于 Avalonia 中样式只能 BaseOn 一个基样式,Acss 的样式不能直接继承样式,但是可以继承多个样式模板

1. 样式模板

抽象模板指的是,不指定 Selector 的样式模板。抽象模板没有指定具体的类型,因此它也不能被解析成具体的 Avalonia 样式。

例如,下面定义了两个样式模板,模板的 Key 分别为 “.ctrl” 和 “.border”。

2. 文件导入

继承样式模板的条件是,当前 IAcssFile 环境中,具备该样式模板,有两种方式可以达到目的。

  • 在当前 IAcssFile 中定义该模板。注意须定义在最外层,而不能放入任何 Style 的 Children 当中。

  • 在独立的文件当中定义该模板,使用 base 关键字在文件最前面导入该文件。方法如下:

注意

  1. 导入文件的相对目录参考当前 IAcssFile 的所在目录。

  2. 可以导入多个文件,一个一行,以 “;” 标记结束。

3. 继承模板

Acss 的样式可以继承多个模板。

使用模板:

最后更新于

这有帮助吗?