public partial class MyPage : ContentPage
public MyPage()
InitializeComponent();
using (var reader = new StringReader("^contentpage { background-color: lightgray; }"))
this.Resources.Add(StyleSheet.FromReader(reader));
方法的参数 StyleSheet.FromReader
是 TextReader
已读取样式表的参数。
选择元素并应用属性
CSS 使用选择器来确定要面向的元素。 按定义顺序连续应用具有匹配选择器的样式。 对特定项定义的样式始终最后应用。 有关受支持的选择器的详细信息,请参阅 选择器参考。
CSS 使用属性设置所选元素的样式。 每个属性都有一组可能的值,某些属性可能会影响任何类型的元素,而另一些属性则应用于元素组。 有关支持的属性的详细信息,请参阅 属性参考。
如果子样式表设置相同的属性,则子样式表始终重写父样式表。 因此,应用设置相同属性的样式时,会遵循以下优先规则:
应用程序资源中定义的样式将被页面资源中定义的样式覆盖(如果它们设置了相同的属性)。
如果控件资源中定义的样式设置相同的属性,页面资源中定义的样式将被覆盖。
如果控件资源中定义了相同的属性,则应用程序资源中定义的样式将被覆盖。
不支持 CSS 变量。
按类型选择元素
可以通过类型选择可视化树中的元素,并采用不区分 element
大小写的选择器:
stacklayout {
margin: 20;
此选择器标识使用样式表的页面上的任何 StackLayout
元素,并将页边距设置为统一的粗细 20。
element
选择器不标识指定类型的子类。
按基类选择元素
可以通过基类选择可视化树中的元素,并采用不区分 ^base
大小写的选择器:
^contentpage {
background-color: lightgray;
此选择器标识使用样式表的任何 ContentPage
元素,并将其背景色设置为 lightgray
。
选择 ^base
器特定于 Xamarin.FormsCSS 规范,不是 CSS 规范的一部分。
按名称选择元素
可以使用区分 #id
大小写的选择器选择可视化树中的单个元素:
#listView {
background-color: lightgray;
此选择器标识其 StyleId
属性设置为 listView
的元素。 但是,如果未设置属性 StyleId
,选择器将回退到使用 x:Name
元素。 因此,在以下 XAML 示例中, #listView
选择器将标识 ListView
其 x:Name
属性设置为 listView
,并将其背景色设置为 lightgray
。
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Assets/styles.css" />
</ContentPage.Resources>
<StackLayout>
<ListView x:Name="listView" ...>
</ListView>
</StackLayout>
</ContentPage>
选择具有特定类属性的元素
可以使用区分 .class
大小写的选择器选择具有特定类属性的元素:
.detailPageTitle {
font-style: bold;
font-size: medium;
text-align: center;
.detailPageSubtitle {
text-align: center;
font-style: italic;
通过将元素的属性设置为 StyleClass
CSS 类名称,可以将 CSS 类分配给 XAML 元素。 因此,在以下 XAML 示例中,类定义的 .detailPageTitle
样式将分配给第一 Label
个,而类定义的 .detailPageSubtitle
样式则分配给第二个 Label
样式。
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Assets/styles.css" />
</ContentPage.Resources>
<ScrollView>
<StackLayout>
<Label ... StyleClass="detailPageTitle" />
<Label ... StyleClass="detailPageSubtitle"/>
</StackLayout>
</ScrollView>
</ContentPage>
选择子元素
可以使用不区分 element element
大小写的选择器选择可视化树中的子元素:
listview image {
height: 60;
width: 60;
此选择器标识元素 Image
的 ListView
子元素,并将其高度和宽度设置为 60。 因此,在以下 XAML 示例中, listview image
选择器将标识 Image
其子级 ListView
,并将其高度和宽度设置为 60。
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Assets/styles.css" />
</ContentPage.Resources>
<StackLayout>
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Image ... />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
element element
选择器不需要子元素是父级的直接子元素 , 子元素可能具有不同的父元素。 如果上级是指定的第一个元素,则会发生选择。
选择直接子元素
可以通过不区分 element>element
大小写的选择器选择可视化树中的直接子元素:
stacklayout>image {
height: 200;
width: 200;
此选择器标识任何 Image
直接子元素的 StackLayout
元素,并将其高度和宽度设置为 200。 因此,在以下 XAML 示例中, stacklayout>image
选择器将标识 Image
该 StackLayout
子级,并将其高度和宽度设置为 200。
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Assets/styles.css" />
</ContentPage.Resources>
<ScrollView>
<StackLayout>
<Image ... />
</StackLayout>
</ScrollView>
</ContentPage>
element>element
选择器要求子元素是父级的直接子元素。
选择器参考
以下 CSS 选择器受以下 Xamarin.Forms支持:
#email
Selects all elements with StyleId
set to email
. 如果未 StyleId
设置,则回退到 x:Name
。 使用 XAML 时, x:Name
首选使用 StyleId
XAML。 请注意,此选择器区分大小写。
选择所有元素。
element
label
选择类型 Label
的所有元素,但不选择子类。 请注意,此选择器不区分大小写。
^base
^contentpage
选择作为 ContentPage
基类的所有元素,包括 ContentPage
本身。 请注意,此选择器不区分大小写,不属于 CSS 规范。
element,element
label,button
选择所有 Button
元素和所有 Label
元素。 请注意,此选择器不区分大小写。
element element
stacklayout label
选择其中StackLayout
的所有Label
元素。 请注意,此选择器不区分大小写。
element>element
stacklayout>label
选择作为StackLayout
直接父级的所有Label
元素。 请注意,此选择器不区分大小写。
element+element
label+entry
直接选择一个Label
之后的所有Entry
元素。 请注意,此选择器不区分大小写。
element~element
label~entry
选择前面有一个Label
元素的所有Entry
元素。 请注意,此选择器不区分大小写。
按定义顺序连续应用具有匹配选择器的样式。 对特定项定义的样式始终最后应用。
可以选择器可以组合在一起,而不限制,例如 StackLayout>ContentView>label.email
。
当前不支持以下选择器:
[attribute]
@media
和 @supports
:
和 ::
不支持特定性和特定性替代。
值列中 (支持Xamarin.Forms以下 CSS 属性,类型为斜体,而字符串文本gray
) :
align-content
FlexLayout
stretch
| center
| start
| end
| spacebetween
| spacearound
| spaceevenly
| flex-start
| flex-end
| space-between
| space-around
| initial
align-content: space-between;
align-items
FlexLayout
stretch
| center
| start
| end
| flex-start
| flex-end
| initial
align-items: flex-start;
align-self
VisualElement
auto
| stretch
| center
| start
| end
| flex-start
| flex-end
| initial
align-self: flex-end;
background-color
VisualElement
颜色 | initial
background-color: springgreen;
background-image
字符串 | initial
background-image: bg.png;
border-color
Button
, Frame
, ImageButton
颜色 | initial
border-color: #9acd32;
border-radius
BoxView
, Button
, Frame
, ImageButton
双 | initial
border-radius: 10;
border-width
Button
, ImageButton
双 | initial
border-width: .5;
color
ActivityIndicator
, BoxView
, Button
, CheckBox
, DatePicker
, Editor
, Entry
, Label
, Picker
, ProgressBar
, SearchBar
, Switch
, TimePicker
颜色 | initial
color: rgba(255, 0, 0, 0.3);
column-gap
双 | initial
column-gap: 9;
direction
VisualElement
ltr
| rtl
| inherit
| initial
direction: rtl;
flex-direction
FlexLayout
column
| columnreverse
| row
| rowreverse
| row-reverse
| column-reverse
| initial
flex-direction: column-reverse;
flex-basis
VisualElement
float | auto
| initial
。 此外,可以使用符号指定范围 0% 到 100% 的 %
百分比。
flex-basis: 25%;
flex-grow
VisualElement
浮动 | initial
flex-grow: 1.5;
flex-shrink
VisualElement
浮动 | initial
flex-shrink: 1;
flex-wrap
VisualElement
nowrap
| wrap
| reverse
| wrap-reverse
| initial
flex-wrap: wrap-reverse;
font-family
Button
, DatePicker
, Editor
, Entry
, Label
, Picker
, SearchBar
, TimePicker
, Span
字符串 | initial
font-family: Consolas;
font-size
Button
, DatePicker
, Editor
, Entry
, Label
, Picker
, SearchBar
, TimePicker
, Span
双 | namedsize | initial
font-size: 12;
font-style
Button
, DatePicker
, Editor
, Entry
, Label
, Picker
, SearchBar
, TimePicker
, Span
bold
| italic
| initial
font-style: bold;
height
VisualElement
双 | initial
min-height: 250;
justify-content
FlexLayout
start
| center
| end
| spacebetween
| spacearound
| spaceevenly
| flex-start
| flex-end
| space-between
| space-around
| initial
justify-content: flex-end;
letter-spacing
Button
, DatePicker
, Editor
, Entry
, Label
, Picker
, SearchBar
, SearchHandler
, Span
, TimePicker
双 | initial
letter-spacing: 2.5;
line-height
Label
, Span
双 | initial
line-height: 1.8;
margin
厚度 | initial
margin: 6 12;
margin-left
厚度 | initial
margin-left: 3;
margin-top
厚度 | initial
margin-top: 2;
margin-right
厚度 | initial
margin-right: 1;
margin-bottom
厚度 | initial
margin-bottom: 6;
max-lines
Label
Int | initial
max-lines: 2;
min-height
VisualElement
双 | initial
min-height: 50;
min-width
VisualElement
双 | initial
min-width: 112;
opacity
VisualElement
双 | initial
opacity: .3;
order
VisualElement
Int | initial
order: -1;
padding
Button
, ImageButton
, Layout
, Page
厚度 | initial
padding: 6 12 12;
padding-left
Button
, ImageButton
, Layout
, Page
双 | initial
padding-left: 3;
padding-top
Button
, ImageButton
, Layout
, Page
双 | initial
padding-top: 4;
padding-right
Button
, ImageButton
, Layout
, Page
双 | initial
padding-right: 2;
padding-bottom
Button
, ImageButton
, Layout
, Page
双 | initial
padding-bottom: 6;
position
FlexLayout
relative
| absolute
| initial
position: absolute;
row-gap
双 | initial
row-gap: 12;
text-align
Entry
, EntryCell
, Label
, SearchBar
left
| top
| right
| bottom
| start
| center
| middle
| end
| initial
. left
应 right
避免在从右到左的环境中使用。
text-align: right;
text-decoration
Label
, Span
none
| underline
| strikethrough
| line-through
| initial
text-decoration: underline, line-through;
text-transform
Button
,Editor
, Entry
, Label
, SearchBar
, SearchHandler
none
| default
| uppercase
| lowercase
| initial
text-transform: uppercase;
transform
VisualElement
none
, rotate
, rotateX
, rotateY
, scale
, scaleX
, scaleY
, translate
, translateX
, translateY
, initial
transform: rotate(180), scaleX(2.5);
transform-origin
VisualElement
double、 double | initial
transform-origin: 7.5, 12.5;
vertical-align
Label
left
| top
| right
| bottom
| start
| center
| middle
| end
| initial
vertical-align: bottom;
visibility
VisualElement
true
| visible
| false
| hidden
| collapse
| initial
visibility: hidden;
width
VisualElement
双 | initial
min-width: 320;
速记属性,如 font
和 border
。
此外,没有 inherit
值,因此不支持继承。 因此,不能在布局上设置 font-size
属性,并期望布局中的所有 Label
实例继承该值。 一个例外是 direction
属性,该属性的默认值为 inherit
.
目标 Span
元素有一个已知问题,阻止使用符号) 元素和名称 (#
成为 CSS 样式的目标。 元素 Span
派生自 GestureElement
该属性, StyleClass
因此跨度不支持 CSS 类目标。 有关详细信息,请参阅 无法将 CSS 样式应用于 Span 控件。
值列中还支持以下Xamarin.Forms特定的 CSS 属性 (,类型为斜体,而字符串文本) gray
:
-xf-orientation
ScrollView
, StackLayout
horizontal
| vertical
| both
| initial
. both
仅在一个 ScrollView
.
-xf-orientation: horizontal;
-xf-placeholder
Entry
, Editor
, SearchBar
带引号的文本 | initial
-xf-placeholder: Enter name;
-xf-placeholder-color
Entry
, Editor
, SearchBar
颜色 | initial
-xf-placeholder-color: green;
-xf-spacing
StackLayout
双 | initial
-xf-spacing: 8;
-xf-thumb-color
Slider
, Switch
颜色 | initial
-xf-thumb-color: limegreen;
-xf-vertical-scroll-bar-visibility
ScrollView
default
| always
| never
| initial
-xf-vertical-scroll-bar-visibility: always;
-xf-vertical-text-alignment
Label
start
| center
| end
| initial
-xf-vertical-text-alignment: end;
-xf-visual
VisualElement
字符串 | initial
-xf-visual: material;
“值”列中还支持以下Xamarin.Forms特定于 Shell 的 CSS 属性 (,类型为斜体,而字符串文本gray
) :
X11
与 CSS 颜色、UWP 预定义颜色和 Xamarin.Forms 颜色匹配的颜色。 请注意,这些颜色值不区分大小写。
十六进制颜色:#rgb
、、#argb
、 #rrggbb
#aarrggbb
rgb 颜色: rgb(255,0,0)
, rgb(100%,0%,0%)
。 值在 0-255 范围内,或 0%-100%。
rgba 颜色: rgba(255, 0, 0, 0.8)
, rgba(100%, 0%, 0%, 0.8)
。 不透明度值在 0.0-1.0 范围内。
hsl 颜色: hsl(120, 100%, 50%)
. h 值在 0-360 范围内,而 s 和 l 处于 0%-100% 范围内。
hsla 颜色: hsla(120, 100%, 50%, .8)
. 不透明度值在 0.0-1.0 范围内。
Thickness
支持一个、两个、三个或四 thickness
个值,每个值用空格分隔:
单个值表示统一粗细。
两个值指示垂直,然后水平粗细。
三个值指示顶部,然后水平 (左右) ,然后底部粗细。
四个值指示顶部、右、下、左粗。
CSS thickness
值不同于 XAML Thickness
值。 例如,在 XAML 中,两个值 Thickness
指示水平和垂直粗细,而四个值 Thickness
表示左、上、右、下粗。 此外,XAML Thickness
值以逗号分隔。
NamedSize
支持以下不区分 namedsize
大小写的值:
default
micro
small
medium
large
每个 namedsize
值的确切含义与平台相关且依赖于视图。
可以使用和 CSS 函数分别指定linear-gradient()
radial-gradient()
线性和径向渐变。 应将这些函数的结果分配给 background
控件的属性。
Xamarin.Forms 3.0 CSS 视频
MonkeyAppCSS (示例)
使用 XAML 样式设置 Xamarin.Forms 应用的样式