Avalonia样式选择器语法类比CSS,核心是先选中控件再设置属性;支持类型、命名空间、类名、属性值、父子/后代关系及模板内伪类匹配,需注意命名空间声明、模板路径斜杠和空格分隔等细节。
Avalonia 的样式选择器语法高
度类比 CSS,用起来直观、灵活,核心就两步:先 选中控件,再 设置属性。不需要 TargetType 或 x:Key,靠 Selector 字符串就能精准定位。
最常用的是按控件类型匹配,比如让所有 Button 背景变蓝:
clr-namespace:MyApp.Controls),需声明前缀并用竖线分隔:xmlns:local="clr-namespace:MyApp.Controls",然后写 Selector="local|MyUserControl"
:is(Button),它会匹配 Button 及所有继承自它的控件避免全局污染,常配合 Name 或 Classes 使用:
Name="saveBtn",样式写 Selector="Button#saveBtn"
Classes="primary large",样式可写 Selector="Button.primary" 或 Selector="Button.primary.large"(多个 class 同时满足)Selector="CheckBox[IsChecked=True]";支持附加属性,如 Selector="TextBlock[(Grid.Column)=1]"
逻辑树结构决定匹配范围,注意符号差异:
>):只匹配直接子级,例如 StackPanel > Button 不会选中嵌套在 Grid 里的 ButtonStackPanel Button 会选中 StackPanel 下所有 Button,不管隔几层Window > DockPanel > Button.primary
很多视觉效果藏在控件模板里,必须用 /template/ 显式进入:
Selector="Button /template/ ContentPresenter" + CornerRadius
Button:pointerover /template/ ContentPresenter 表示鼠标悬停时才生效:pressed、:disabled、:focus、:checked,可叠加使用,如 CheckBox:checked /template/ Path
基本上就这些。写法简洁,但细节决定成败——比如命名空间要先 xmlns 声明、模板路径不能漏斜杠、伪类和后续选择器之间要留空格。多练几次,比写 CSS 还顺手。