Avalonia样式选择器语法类比CSS,核心是先选中控件再设置属性;支持类型、命名空间、类名、属性值、父子/后代关系及模板内伪类匹配,需注意命名空间声明、模板路径斜杠和空格分隔等细节。

Avalonia 的样式选择器语法高度类比 CSS,用起来直观、灵活,核心就两步:先 选中控件,再 设置属性。不需要 TargetType 或 x:Key,靠 Selector 字符串就能精准定位。
基础类型与命名空间选择
最常用的是按控件类型匹配,比如让所有 Button 背景变蓝:
- 若控件在自定义命名空间(如
clr-namespace:MyApp.Controls),需声明前缀并用竖线分隔:xmlns:local="clr-namespace:MyApp.Controls",然后写Selector="local|MyUserControl" - 想连派生类(如 ToggleButton)也生效?用
:is(Button),它会匹配 Button 及所有继承自它的控件
按名称、类名和属性精准筛选
避免全局污染,常配合 Name 或 Classes 使用:
- Name 选择器:给控件设
Name="saveBtn",样式写Selector="Button#saveBtn" - Class 选择器:控件加
Classes="primary large",样式可写Selector="Button.primary"或Selector="Button.primary.large"(多个 class 同时满足) - 属性值匹配:比如只对勾选的 CheckBox 生效:
Selector="CheckBox[IsChecked=True]";支持附加属性,如Selector="TextBlock[(Grid.Column)=1]"
父子与后代关系选择
逻辑树结构决定匹配范围,注意符号差异:
- 子选择器(
>):只匹配直接子级,例如StackPanel > Button不会选中嵌套在 Grid 里的 Button - 后代选择器(空格):匹配任意层级后代,
StackPanel 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 还顺手。










