Aplikace stylů používající šablony stylů Cascading
Aplikace .NET Multi-Platform App UI (.NET MAUI) se dají stylovat pomocí šablon stylů CSS (Cascading Style Sheet). Šablona stylů se skládá ze seznamu pravidel, přičemž každé pravidlo se skládá z jednoho nebo více selektorů a bloku deklarace. Blok deklarace se skládá ze seznamu deklarací ve složených závorkách, přičemž každá deklarace se skládá z vlastnosti, dvojtečky a hodnoty. Pokud je v bloku více deklarací, vloží se středník jako oddělovač.
Následující příklad ukazuje některé šablony stylů CSS kompatibilní s rozhraním .NET MAUI:
navigationpage {
-maui-bar-background-color: lightgray;
}
^contentpage {
background-color: lightgray;
}
#listView {
background-color: lightgray;
}
stacklayout {
margin: 20;
-maui-spacing: 6;
}
grid {
row-gap: 6;
column-gap: 6;
}
.mainPageTitle {
font-style: bold;
font-size: 14;
}
.mainPageSubtitle {
margin-top: 15;
}
.detailPageTitle {
font-style: bold;
font-size: 14;
text-align: center;
}
.detailPageSubtitle {
text-align: center;
font-style: italic;
}
listview image {
height: 60;
width: 60;
}
stacklayout>image {
height: 200;
width: 200;
}
V rozhraní .NET MAUI se šablony stylů CSS analyzují a vyhodnocují za běhu, nikoli v době kompilace, a šablony stylů se znovu analyzují při použití.
Důležité
Pomocí šablon stylů CSS není možné plně stylovat aplikaci .NET MAUI. Styly XAML se ale dají použít k doplnění šablon stylů CSS. Další informace o stylech XAML najdete v tématu Aplikace stylů využívající JAZYK XAML.
Využití šablony stylů
Postup přidání šablony stylů do aplikace .NET MAUI je následující:
- Přidejte do projektu aplikace .NET MAUI prázdný soubor CSS. Soubor CSS lze umístit do libovolné složky s doporučenou složkou Resources .
- Nastavte akci sestavení souboru CSS na MauiCss.
Načtení šablony stylů
Existuje řada přístupů, které lze použít k načtení šablony stylů.
Poznámka
Nelze změnit šablonu stylů za běhu a použít novou šablonu stylů.
Načtení šablony stylů v XAML
Šablonu stylů je možné načíst a parsovat s StyleSheet třídou před tím, než ji přidáte ResourceDictionarydo :
<Application ...>
<Application.Resources>
<StyleSheet Source="/Resources/styles.css" />
</Application.Resources>
</Application>
Vlastnost StyleSheet.Source určuje šablonu stylů jako identifikátor URI vzhledem k umístění ohraničujícího souboru XAML nebo vzhledem k kořenovému adresáři projektu, pokud identifikátor URI začíná na /.
Upozornění
Soubor CSS se nepodaří načíst, pokud není akce sestavení nastavená na MauiCss.
Případně můžete šablonu stylů načíst a parsovat s StyleSheet třídou před přidáním do ResourceDictionaryšablony tak, že ji vložíte do oddílu CDATA :
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet>
<![CDATA[
^contentpage {
background-color: lightgray;
}
]]>
</StyleSheet>
</ContentPage.Resources>
...
</ContentPage>
Další informace o slovníkech prostředků najdete v tématu Slovníky zdrojů.
Načtení šablony stylů v jazyce C #
V jazyce C# lze šablonu stylů načíst z StringReader a přidat do :ResourceDictionary
using Microsoft.Maui.Controls.StyleSheets;
public partial class MyPage : ContentPage
{
public MyPage()
{
InitializeComponent();
using (var reader = new StringReader("^contentpage { background-color: lightgray; }"))
{
this.Resources.Add(StyleSheet.FromReader(reader));
}
}
}
Argumentem StyleSheet.FromReader metody je TextReader čtení šablony stylů.
Výběr prvků a použití vlastností
Css používá selektory k určení prvků, které se mají cílit. Styly s odpovídajícími selektory se po sobě po sobě použijí v pořadí definic. Styly definované u konkrétní položky se vždy použijí jako poslední. Další informace o podporovaných selektorech najdete v tématu Odkazy na voliče.
Šablony stylů CSS používají vlastnosti pro styl vybraného prvku. Každá vlastnost má sadu možných hodnot a některé vlastnosti můžou ovlivnit jakýkoli typ elementu, zatímco jiné platí pro skupiny prvků. Další informace o podporovaných vlastnostech najdete v referenčních informacích k vlastnostem.
Podřízené šablony stylů vždy přepíší nadřazené šablony stylů, pokud nastaví stejné vlastnosti. Při použití stylů, které nastavují stejné vlastnosti, se proto použijí následující pravidla priority:
- Styl definovaný v prostředcích aplikace se přepíše stylem definovaným v prostředcích stránky, pokud nastaví stejné vlastnosti.
- Styl definovaný v prostředcích stránky se přepíše stylem definovaným v ovládacích prostředcích, pokud nastaví stejné vlastnosti.
- Styl definovaný v prostředcích aplikace se přepíše stylem definovaným v ovládacích prostředcích, pokud nastaví stejné vlastnosti.
Poznámka
Proměnné CSS nejsou podporovány.
Výběr prvků podle typu
Prvky ve vizuálním stromu je možné vybrat podle typu s voličem nerozlišující element malá a velká písmena:
stacklayout {
margin: 20;
}
Tento selektor identifikuje všechny StackLayout prvky na stránkách, které využívají šablonu stylů, a nastaví jejich okraje na stejnou tloušťku 20.
Poznámka
Selektor element neidentifikuje podtřídy zadaného typu.
Výběr prvků podle základní třídy
Prvky ve vizuálním stromu mohou být vybrány základní třídou s nerozlišujícími ^base velká a malá písmena selektor:
^contentpage {
background-color: lightgray;
}
Tento selektor identifikuje všechny ContentPage prvky, které využívají šablonu stylů, a nastaví jejich barvu pozadí na lightgray.
Poznámka
Selektor ^base je specifický pro .NET MAUI a není součástí specifikace CSS.
Výběr elementu podle názvu
Jednotlivé prvky ve vizuálním stromu je možné vybrat pomocí selektoru rozlišující malá a velká #id písmena:
#listView {
background-color: lightgray;
}
Tento selektor identifikuje prvek, jehož StyleId vlastnost je nastavena na listView. Pokud však StyleId vlastnost není nastavena, selektor se vrátí k použití x:Name prvku. Proto v následujícím příkladu #listView selektor identifikuje ListView , jehož x:Name atribut je nastaven na listView, a nastaví barvu pozadí na lightgray.
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Resources/styles.css" />
</ContentPage.Resources>
<StackLayout>
<ListView x:Name="listView">
...
</ListView>
</StackLayout>
</ContentPage>
Výběr elementů s konkrétním atributem třídy
Prvky s konkrétním atributem třídy lze vybrat pomocí selektoru rozlišující malá a velká .class písmena:
.detailPageTitle {
font-style: bold;
font-size: 14;
text-align: center;
}
.detailPageSubtitle {
text-align: center;
font-style: italic;
}
Třídu CSS lze přiřadit k elementu XAML nastavením StyleClass vlastnosti elementu na název třídy CSS. Proto v následujícím příkladu jsou styly definované .detailPageTitle třídou přiřazeny první Label, zatímco styly definované .detailPageSubtitle třídou jsou přiřazeny druhé Label.
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Resources/styles.css" />
</ContentPage.Resources>
<ScrollView>
<StackLayout>
<Label ... StyleClass="detailPageTitle" />
<Label ... StyleClass="detailPageSubtitle"/>
</StackLayout>
</ScrollView>
</ContentPage>
Výběr podřízených prvků
Podřízené prvky ve vizuálním stromu je možné vybrat pomocí selektoru nerozlišující element element malá a velká písmena:
listview image {
height: 60;
width: 60;
}
Tento selektor identifikuje všechny Image prvky, které jsou podřízenými ListView prvky prvků, a nastaví jejich výšku a šířku na 60. V následujícím příkladu listview image XAML proto selektor identifikuje Image podřízenou položku ListViewa nastaví její výšku a šířku na 60.
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Resources/styles.css" />
</ContentPage.Resources>
<StackLayout>
<ListView ...>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
...
<Image ... />
...
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Poznámka
Selektor element element nevyžaduje, aby podřízený prvek byl přímým podřízeným prvkem nadřazeného objektu – podřízený prvek může mít jiný nadřazený prvek. Výběr nastane za předpokladu, že nadřazeným prvkem je zadaný první prvek.
Výběr přímých podřízených prvků
Přímé podřízené prvky ve vizuálním stromu je možné vybrat pomocí selektoru nerozlišující element>element malá a velká písmena:
stacklayout>image {
height: 200;
width: 200;
}
Tento selektor identifikuje všechny Image prvky, které jsou přímými podřízenými StackLayout prvky prvků, a nastaví jejich výšku a šířku na 200. Proto v následujícím příkladu stacklayout>image selektor identifikuje Image přímou podřízenou položku StackLayouta nastaví její výšku a šířku na 200.
<ContentPage ...>
<ContentPage.Resources>
<StyleSheet Source="/Resources/styles.css" />
</ContentPage.Resources>
<ScrollView>
<StackLayout>
...
<Image ... />
...
</StackLayout>
</ScrollView>
</ContentPage>
Poznámka
Selektor element>element vyžaduje, aby podřízený prvek byl přímým podřízeným prvkem nadřazeného objektu.
Referenční informace k selektoru
Rozhraní .NET MAUI podporuje následující selektory CSS:
| Volič | Příklad | Description |
|---|---|---|
.class |
.header |
Vybere všechny prvky s vlastností obsahující hlavičku StyleClass . Tento selektor rozlišuje malá a velká písmena. |
#id |
#email |
Vybere všechny prvky s nastaveným parametrem StyleIdemail. Pokud StyleId není nastavena, nastavte náhradní možnost x:Name. Při použití XAML x:Name je upřednostňovaný před StyleId. Tento selektor rozlišuje malá a velká písmena. |
* |
* |
Vybere všechny prvky. |
element |
label |
Vybere všechny prvky typu Label, ale ne podtřídy. Tento selektor nerozlišuje velká a malá písmena. |
^base |
^contentpage |
Vybere všechny prvky jako ContentPage základní třídu, včetně ContentPage samotné. Tento selektor nerozlišuje velká a malá písmena a není součástí specifikace CSS. |
element,element |
label,button |
Vybere všechny Button prvky a všechny Label prvky. Tento selektor nerozlišuje velká a malá písmena. |
element element |
stacklayout label |
Vybere všechny Label prvky uvnitř objektu StackLayout. Tento selektor nerozlišuje velká a malá písmena. |
element>element |
stacklayout>label |
Vybere všechny Label prvky s StackLayout přímým nadřazeným objektem. Tento selektor nerozlišuje velká a malá písmena. |
element+element |
label+entry |
Vybere všechny Entry prvky přímo za .Label Tento selektor nerozlišuje velká a malá písmena. |
element~element |
label~entry |
Vybere všechny Entry prvky předcházející znaku Label. Tento selektor nerozlišuje velká a malá písmena. |
Styly s odpovídajícími selektory se po sobě po sobě použijí v pořadí definic. Styly definované u konkrétní položky se vždy použijí jako poslední.
Tip
Selektory lze kombinovat bez omezení, například StackLayout>ContentView>label.email.
Následující selektory nejsou podporovány:
[attribute]@mediaa@supports:a::
Poznámka
Specificita a přepsání specificity nejsou podporována.
Referenční dokumentace vlastností
Rozhraní .NET MAUI podporuje následující vlastnosti CSS (ve sloupci Hodnoty jsou typy kurzíva, zatímco řetězcové literály jsou gray):
| Vlastnost | Platí pro | Hodnoty | Příklad |
|---|---|---|---|
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 |
Barev | initial |
background-color: springgreen; |
background-image |
Page |
Řetězec | initial |
background-image: bg.png; |
border-color |
Button, Frame, ImageButton |
Barev | initial |
border-color: #9acd32; |
border-radius |
BoxView, Button, Frame, ImageButton |
Dvojité | initial |
border-radius: 10; |
border-width |
Button, ImageButton |
Dvojité | initial |
border-width: .5; |
color |
ActivityIndicator, BoxView, Button, CheckBox, DatePicker, Editor, Entry, Label, Picker, ProgressBar, SearchBar, Switch, TimePicker |
Barev | initial |
color: rgba(255, 0, 0, 0.3); |
column-gap |
Grid |
Dvojité | 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. Kromě toho lze pomocí znaménka zadat procento v rozsahu % 0 až 100 %. |
flex-basis: 25%; |
flex-grow |
VisualElement |
Float | initial |
flex-grow: 1.5; |
flex-shrink |
VisualElement |
Float | 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 |
Řetězec | initial |
font-family: Consolas; |
font-size |
Button, DatePicker, Editor, Entry, Label, Picker, SearchBar, TimePicker, Span |
Dvojité | initial |
font-size: 12; |
font-style |
Button, DatePicker, Editor, Entry, Label, Picker, SearchBar, TimePicker, Span |
bold | italic | initial |
font-style: bold; |
height |
VisualElement |
Dvojité | 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 |
Dvojité | initial |
letter-spacing: 2.5; |
line-height |
Label, Span |
Dvojité | initial |
line-height: 1.8; |
margin |
View |
Tloušťka | initial |
margin: 6 12; |
margin-left |
View |
Tloušťka | initial |
margin-left: 3; |
margin-top |
View |
Tloušťka | initial |
margin-top: 2; |
margin-right |
View |
Tloušťka | initial |
margin-right: 1; |
margin-bottom |
View |
Tloušťka | initial |
margin-bottom: 6; |
max-lines |
Label |
Int | initial |
max-lines: 2; |
min-height |
VisualElement |
Dvojité | initial |
min-height: 50; |
min-width |
VisualElement |
Dvojité | initial |
min-width: 112; |
opacity |
VisualElement |
Dvojité | initial |
opacity: .3; |
order |
VisualElement |
Int | initial |
order: -1; |
padding |
Button, ImageButton, Layout, Page |
Tloušťka | initial |
padding: 6 12 12; |
padding-left |
Button, ImageButton, Layout, Page |
Dvojité | initial |
padding-left: 3; |
padding-top |
Button, ImageButton, Layout, Page |
Dvojité | initial |
padding-top: 4; |
padding-right |
Button, ImageButton, Layout, Page |
Dvojité | initial |
padding-right: 2; |
padding-bottom |
Button, ImageButton, Layout, Page |
Dvojité | initial |
padding-bottom: 6; |
position |
FlexLayout |
relative | absolute | initial |
position: absolute; |
row-gap |
Grid |
Dvojité | initial |
row-gap: 12; |
text-align |
Entry, EntryCell, Label, SearchBar |
left | top | right | bottom | start | center | middle | end | initial. left a right měli byste se vyhnout v prostředích se zprava doleva. |
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 |
Dvojité | initial |
min-width: 320; |
Poznámka
initial je platná hodnota pro všechny vlastnosti. Vymaže hodnotu (obnoví výchozí hodnotu), která byla nastavena z jiného stylu.
Následující vlastnosti nejsou podporovány:
all: initial.- Vlastnosti rozložení (pole nebo mřížka).
- Zkrácené vlastnosti, například
font, aborder.
Navíc neexistuje žádná inherit hodnota, takže dědičnost není podporovaná. Proto nemůžete například nastavit font-size vlastnost v rozložení a očekávat, že všechny Label instance v rozložení zdědí hodnotu. Jedinou výjimkou je direction vlastnost, která má výchozí hodnotu inherit.
Důležité
Span elementy nelze cílit pomocí šablon stylů CSS.
Specifické vlastnosti rozhraní .NET MAUI
Podporují se také následující vlastnosti CSS specifické pro .NET MAUI (ve sloupci Hodnoty jsou typy kurzíva, zatímco řetězcové literály jsou gray):
| Vlastnost | Platí pro | Hodnoty | Příklad |
|---|---|---|---|
-maui-bar-background-color |
NavigationPage, TabbedPage |
Barev | initial |
-xf-bar-background-color: teal; |
-maui-bar-text-color |
NavigationPage, TabbedPage |
Barev | initial |
-xf-bar-text-color: gray |
-maui-horizontal-scroll-bar-visibility |
ScrollView |
default | always | never | initial |
-xf-horizontal-scroll-bar-visibility: never; |
-maui-max-length |
Entry, Editor, SearchBar |
Int | initial |
-xf-max-length: 20; |
-maui-max-track-color |
Slider |
Barev | initial |
-xf-max-track-color: red; |
-maui-min-track-color |
Slider |
Barev | initial |
-xf-min-track-color: yellow; |
-maui-orientation |
ScrollView, StackLayout |
horizontal | vertical | both | initial. both je podporován pouze na ScrollView. |
-xf-orientation: horizontal; |
-maui-placeholder |
Entry, Editor, SearchBar |
Citovaný text | initial |
-xf-placeholder: Enter name; |
-maui-placeholder-color |
Entry, Editor, SearchBar |
Barev | initial |
-xf-placeholder-color: green; |
-maui-spacing |
StackLayout |
Dvojité | initial |
-xf-spacing: 8; |
-maui-thumb-color |
Slider, Switch |
Barev | initial |
-xf-thumb-color: limegreen; |
-maui-vertical-scroll-bar-visibility |
ScrollView |
default | always | never | initial |
-xf-vertical-scroll-bar-visibility: always; |
-maui-vertical-text-alignment |
Label |
start | center | end | initial |
-xf-vertical-text-alignment: end; |
-maui-visual |
VisualElement |
Řetězec | initial |
-xf-visual: material; |
Specifické vlastnosti prostředí .NET MAUI
Podporují se také následující vlastnosti css specifické pro prostředí .NET MAUI (ve sloupci Hodnoty jsou typy kurzíva, zatímco řetězcové literály jsou gray):
| Vlastnost | Platí pro | Hodnoty | Příklad |
|---|---|---|---|
-maui-flyout-background |
Shell |
Barev | initial |
-xf-flyout-background: red; |
-maui-shell-background |
Element |
Barev | initial |
-xf-shell-background: green; |
-maui-shell-disabled |
Element |
Barev | initial |
-xf-shell-disabled: blue; |
-maui-shell-foreground |
Element |
Barev | initial |
-xf-shell-foreground: yellow; |
-maui-shell-tabbar-background |
Element |
Barev | initial |
-xf-shell-tabbar-background: white; |
-maui-shell-tabbar-disabled |
Element |
Barev | initial |
-xf-shell-tabbar-disabled: black; |
-maui-shell-tabbar-foreground |
Element |
Barev | initial |
-xf-shell-tabbar-foreground: gray; |
-maui-shell-tabbar-title |
Element |
Barev | initial |
-xf-shell-tabbar-title: lightgray; |
-maui-shell-tabbar-unselected |
Element |
Barev | initial |
-xf-shell-tabbar-unselected: cyan; |
-maui-shell-title |
Element |
Barev | initial |
-xf-shell-title: teal; |
-maui-shell-unselected |
Element |
Barev | initial |
-xf-shell-unselected: limegreen; |
Barva
Podporují se následující color hodnoty:
X11barvy, které odpovídají barvám CSS a barvám .NET MAUI. Tyto barevné hodnoty nerozlišují malá a velká písmena.- šestnáctkové barvy:
#rgb,#argb,#rrggbb#aarrggbb - rgb barvy:
rgb(255,0,0),rgb(100%,0%,0%). Hodnoty jsou v rozsahu 0–255 nebo 0–100 %. - rgba barvy:
rgba(255, 0, 0, 0.8),rgba(100%, 0%, 0%, 0.8). Hodnota neprůhlednosti je v rozsahu 0,0 až 1,0. - hsl barvy:
hsl(120, 100%, 50%). Hodnota h je v rozsahu 0 až 360, zatímco s a l jsou v rozsahu 0%-100%. - barvy hsla:
hsla(120, 100%, 50%, .8). Hodnota neprůhlednosti je v rozsahu 0,0 až 1,0.
Tloušťka
Jedna, dvě, tři nebo čtyři thickness hodnoty jsou podporovány, přičemž každá je oddělená prázdným znakem:
- Jedna hodnota označuje jednotnou tloušťku.
- Dvě hodnoty označují svislou tloušťku a pak vodorovnou tloušťku.
- Tři hodnoty označují nahoře, pak vodorovné (vlevo a vpravo) a pak tloušťku dolního okraje.
- Čtyři hodnoty označují horní, pak vpravo, pak dole a pak levou tloušťku.
Poznámka
Hodnoty CSS thickness se liší od hodnot XAML Thickness . Například v XAML dvouhodnotová hodnota Thickness označuje vodorovnou a svislou tloušťku, zatímco čtyřhodnotová hodnota Thickness označuje vlevo, pak nahoře, pak vpravo a pak dole tloušťku. Kromě toho jsou hodnoty XAML Thickness oddělené čárkami.
Functions
Lineární a paprskové přechody lze zadat pomocí linear-gradient() funkcí CSS.radial-gradient() Výsledek těchto funkcí by měl být přiřazen vlastnosti background ovládacího prvku.