次の方法で共有


カスケード スタイル シートを使用してアプリをスタイル設定する

.NET マルチプラットフォーム アプリ UI (.NET MAUI) アプリは、カスケード スタイル シート (CSS) を使用してスタイルを設定できます。 スタイル シートはルールのリストで構成され、各ルールは 1 つ以上のセレクターと宣言ブロックで構成されます。 宣言ブロックは、各宣言がプロパティ、コロン、および値で構成される、中かっこ内の宣言の一覧で構成されます。 ブロック内に複数の宣言がある場合は、セミコロンが区切り記号として挿入されます。

次の例は、.NET MAUI に準拠している CSS を示しています。

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;
}

.NET MAUI では、CSS スタイル シートはコンパイル時ではなく実行時に解析および評価され、スタイル シートは使用中に再解析されます。

大事な

CSS を使用して .NET MAUI アプリのスタイルを完全に設定することはできません。 ただし、XAML スタイルを使用して CSS を補完できます。 XAML スタイルの詳細については、「XAML を使用したスタイル アプリ」を参照してください。

スタイルシートを読み込む

.NET MAUI アプリにスタイル シートを追加するプロセスは次のとおりです。

  1. 空の CSS ファイルを .NET MAUI アプリ プロジェクトに追加します。 CSS ファイルは任意のフォルダーに配置でき、推奨される場所は Resources フォルダーです。
  2. CSS ファイルのビルド アクションを MauiCsに設定します。

スタイル シートの読み込み

スタイル シートの読み込みに使用できる方法は多数あります。

手記

実行時にスタイル シートを変更して、新しいスタイル シートを適用することはできません。

XAML でスタイル シートを読み込む

スタイル シートは、ResourceDictionaryに追加する前に、StyleSheet クラスで読み込んで解析できます。

<Application ...>
    <Application.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </Application.Resources>
</Application>

StyleSheet.Source プロパティは、スタイル シートを囲む XAML ファイルの場所を基準とした URI として指定します。URI が /で始まる場合はプロジェクト ルートを基準にして指定します。

警告

ビルド アクションが mauiCss に設定されていない場合、CSS ファイルの読み込みに失敗します。

または、スタイル シートを読み込み、StyleSheet クラスで解析してから、ResourceDictionaryに追加することもできます。そのためには、CDATA セクションにインライン展開します。

<ContentPage ...>
    <ContentPage.Resources>
        <StyleSheet>
            <![CDATA[
            ^contentpage {
                background-color: lightgray;
            }
            ]]>
        </StyleSheet>
    </ContentPage.Resources>
    ...
</ContentPage>

リソース ディクショナリの詳細については、「リソース ディクショナリ を参照してください。

C でスタイル シートを読み込む#

C# では、スタイル シートを StringReader から読み込み、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));
        }
    }
}

StyleSheet.FromReader メソッドの引数は、スタイル シートを読み取った TextReader です。

要素を選択してプロパティを適用する

CSS はセレクターを使用して、ターゲットとする要素を決定します。 セレクターが一致するスタイルは、定義順に連続して適用されます。 特定の項目に定義されているスタイルは、常に最後に適用されます。 サポートされているセレクターの詳細については、「Selector リファレンス」を参照してください。

CSS では、プロパティを使用して選択した要素のスタイルを設定します。 各プロパティには一連の値があり、一部のプロパティは任意の種類の要素に影響を与え、他のプロパティは要素のグループに適用されます。 サポートされるプロパティの詳細については、「プロパティ リファレンス」を参照してください。

子スタイルシートは、同じプロパティを設定する場合、常に親スタイルシートをオーバーライドします。 そのため、同じプロパティを設定するスタイルを適用する場合は、次の優先順位規則に従います。

  • アプリ リソースで定義されているスタイルは、同じプロパティを設定した場合、ページ リソースで定義されているスタイルによって上書きされます。
  • ページ リソースで定義されているスタイルは、同じプロパティを設定した場合、コントロール リソースで定義されているスタイルによって上書きされます。
  • アプリ リソースで定義されているスタイルは、同じプロパティを設定した場合、コントロール リソースで定義されているスタイルによって上書きされます。

手記

CSS 変数はサポートされていません。

型で要素を選択する

ビジュアル ツリー内の要素は、大文字と小文字を区別しない element セレクターを使用して、型によって選択できます。

stacklayout {
    margin: 20;
}

このセレクターは、スタイル シートを使用するページ上の StackLayout 要素を識別し、余白を 20 の均一な太さに設定します。

手記

element セレクターは、指定した型のサブクラスを識別しません。

基底クラスによる要素の選択

ビジュアル ツリー内の要素は、大文字と小文字を区別しない ^base セレクターを使用して基底クラスによって選択できます。

^contentpage {
    background-color: lightgray;
}

このセレクターは、スタイル シートを使用する ContentPage 要素を識別し、その背景色を lightgrayに設定します。

手記

^base セレクターは .NET MAUI に固有であり、CSS 仕様の一部ではありません。

名前による要素の選択

ビジュアル ツリー内の個々の要素は、大文字と小文字を区別する #id セレクターで選択できます。

#listView {
    background-color: lightgray;
}

このセレクターは、StyleId プロパティが listViewに設定されている要素を識別します。 ただし、StyleId プロパティが設定されていない場合、セレクターは要素の x:Name の使用にフォールバックします。 したがって、次の例では、#listView セレクターは、x:Name 属性が listViewに設定されている ListView を識別し、背景色を lightgrayに設定します。

<ContentPage ...>
    <ContentPage.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </ContentPage.Resources>
    <StackLayout>
        <ListView x:Name="listView">
            ...
        </ListView>
    </StackLayout>
</ContentPage>

特定のクラス属性を持つ要素を選択する

特定のクラス属性を持つ要素は、大文字と小文字を区別する .class セレクターで選択できます。

.detailPageTitle {
    font-style: bold;
    font-size: 14;
    text-align: center;
}

.detailPageSubtitle {
    text-align: center;
    font-style: italic;
}

要素の StyleClass プロパティを CSS クラス名に設定することで、CSS クラスを XAML 要素に割り当てることができます。 したがって、次の例では、.detailPageTitle クラスによって定義されたスタイルが最初の Labelに割り当てられ、.detailPageSubtitle クラスによって定義されたスタイルが 2 番目の Labelに割り当てられます。

<ContentPage ...>
    <ContentPage.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </ContentPage.Resources>
    <ScrollView>
        <StackLayout>
            <Label ... StyleClass="detailPageTitle" />
            <Label ... StyleClass="detailPageSubtitle"/>
        </StackLayout>
    </ScrollView>
</ContentPage>

子要素の選択

ビジュアル ツリー内の子要素は、大文字と小文字を区別しない element element セレクターで選択できます。

listview image {
    height: 60;
    width: 60;
}

このセレクターは、ListView 要素の子である Image 要素を識別し、その高さと幅を 60 に設定します。 そのため、次の XAML の例では、listview image セレクターは、ListViewの子である Image を識別し、その高さと幅を 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>

手記

element element セレクターでは、子要素が親の直接 である必要はありません。子要素には別の親が含まれている場合があります。 先祖が指定した最初の要素である場合、選択が行われます。

直接子要素を選択する

ビジュアル ツリー内の直接の子要素は、大文字と小文字を区別しない element>element セレクターで選択できます。

stacklayout>image {
    height: 200;
    width: 200;
}

このセレクターは、StackLayout 要素の直接の子である Image 要素を識別し、その高さと幅を 200 に設定します。 したがって、次の例では、stacklayout>image セレクターは、StackLayoutの直接の子である Image を識別し、その高さと幅を 200 に設定します。

<ContentPage ...>
    <ContentPage.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </ContentPage.Resources>
    <ScrollView>
        <StackLayout>
            ...
            <Image ... />
            ...
        </StackLayout>
    </ScrollView>
</ContentPage>

手記

element>element セレクターでは、子要素が親の直接 である必要があります。

セレクターリファレンス

.NET MAUI では、次の CSS セレクターがサポートされています。

セレクタ 説明
.class .header 'header' を含む StyleClass プロパティを持つすべての要素を選択します。 このセレクターはケースセンシティブです。
#id #email StyleIdemailに設定されているすべての要素を選択します。 StyleId が設定されていない場合は、x:Nameにフォールバックします。 XAML を使用する場合は、StyleIdよりも x:Name をお勧めします。 このセレクターはケースに敏感です。
* * すべての要素を選択します。
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
  • :::

手記

特定性および上書きによる特定性の変更はサポートされていません。

2 つ以上の CSS ルールが同じ要素を指している場合、最も高い特異性を持つセレクターが優先され、そのスタイル宣言が要素に適用されます。 の特定性アルゴリズム、CSS セレクターの重みを計算して、競合する CSS 宣言から要素に適用されるルールを決定します。

プロパティリファレンス

.NET MAUI では、次の 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 Page 文字列 | initialする background-image: bg.png;
border-color ButtonFrameImageButton | initial border-color: #9acd32;
border-radius BoxViewButtonFrameImageButton ダブル | initial border-radius: 10;
border-width ButtonImageButton ダブル | 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 Grid ダブル | 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 を float する 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 文字列 | initialする font-family: Consolas;
font-size Button, DatePicker, Editor, Entry, Label, Picker, SearchBar, TimePicker, Span ダブル | initial font-size: 12;
font-style Button, DatePicker, Editor, Entry, Label, Picker, SearchBar, TimePicker, Span bold | italic | initial font-style: bold;
height VisualElement ダブル | initial 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 LabelSpan ダブル | initial line-height: 1.8;
margin View の太さ | initial margin: 6 12;
margin-left View の太さ | initial margin-left: 3;
margin-top View の太さ | initial margin-top: 2;
margin-right View の太さ | initial margin-right: 1;
margin-bottom View の太さ | 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 ButtonImageButtonLayoutPage の太さ | initial padding: 6 12 12;
padding-left ButtonImageButtonLayoutPage ダブル | initial padding-left: 3;
padding-top ButtonImageButtonLayoutPage ダブル | initial padding-top: 4;
padding-right ButtonImageButtonLayoutPage ダブル | initial padding-right: 2;
padding-bottom ButtonImageButtonLayoutPage ダブル | initial padding-bottom: 6;
position FlexLayout relative | absolute | initial position: absolute;
row-gap Grid ダブル | initial row-gap: 12;
text-align EntryEntryCellLabelSearchBar left | top | right | bottom | start | center | middle | end | initial. leftright は、右から左の環境では避ける必要があります。 text-align: right;
text-decoration LabelSpan 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 二重 、二重 | 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 width: 320;

手記

initial は、すべてのプロパティに対して有効な値です。 別のスタイルから設定された値がクリアされます (既定値にリセットされます)。

次のプロパティはサポートされていません。

  • all: initial.
  • レイアウトのプロパティ (ボックスまたはグリッド)。
  • fontborderなどの短縮形プロパティ。

さらに、inherit 値がないため、継承はサポートされていません。 そのため、たとえば、レイアウトに font-size プロパティを設定し、レイアウト内のすべての Label インスタンスが値を継承することを想定することはできません。 1 つの例外は direction プロパティで、既定値は inheritです。

大事な

Span 要素は CSS を使用してターゲットにすることはできません。

.NET MAUI 固有のプロパティ

次の .NET MAUI 固有の CSS プロパティもサポートされています ([値] 列では、型は斜体 され、文字列リテラルは gray)。

財産 適用対象 価値観
-maui-bar-background-color NavigationPageTabbedPage カラー | initial -maui-bar-background-color: teal;
-maui-bar-text-color NavigationPageTabbedPage 色の | initial -maui-bar-text-color: gray
-maui-horizontal-scroll-bar-visibility ScrollView default | always | never | initial -maui-horizontal-scroll-bar-visibility: never;
-maui-max-length EntryEditorSearchBar int | initialする -maui-max-length: 20;
-maui-max-track-color Slider カラー | initial -maui-max-track-color: red;
-maui-min-track-color Slider 色の | initial -maui-min-track-color: yellow;
-maui-orientation ScrollViewStackLayout horizontal | vertical | both | initial. both は、ScrollViewでのみサポートされます。 -maui-orientation: horizontal;
-maui-placeholder EntryEditorSearchBar 引用されたテキスト | initialにする -maui-placeholder: Enter name;
-maui-placeholder-color EntryEditorSearchBar 色の | initial -maui-placeholder-color: green;
-maui-spacing StackLayout ダブル | initial -maui-spacing: 8;
-maui-shadow VisualElement 有効な形式: color、offsetX、offsetY | offsetX、offsetY、半径、色 | offsetX、offsetY、radius、color、opacity -maui-shadow: #000000 4 4;
-maui-thumb-color SliderSwitch 色の | initial -maui-thumb-color: limegreen;
-maui-vertical-scroll-bar-visibility ScrollView default | always | never | initial -maui-vertical-scroll-bar-visibility: always;
-maui-vertical-text-alignment Label start | center | end | initial -maui-vertical-text-alignment: end;
-maui-visual VisualElement 文字列 | initial -maui-visual: material;

.NET MAUI Shell 固有のプロパティ

次の .NET MAUI シェル固有の CSS プロパティもサポートされています ([値] 列では、型は斜体 されますが、文字列リテラルは gray)。

財産 適用対象 価値観
-maui-flyout-background Shell 色の | initial -maui-flyout-background: red;
-maui-shell-background Element カラー | initial -maui-shell-background: green;
-maui-shell-disabled Element 色の | initial -maui-shell-disabled: blue;
-maui-shell-foreground Element 色の | initial -maui-shell-foreground: yellow;
-maui-shell-tabbar-background Element 色の | initial -maui-shell-tabbar-background: white;
-maui-shell-tabbar-disabled Element 色の | initial -maui-shell-tabbar-disabled: black;
-maui-shell-tabbar-foreground Element 色の | initial -maui-shell-tabbar-foreground: gray;
-maui-shell-tabbar-title Element 色の | initial -maui-shell-tabbar-title: lightgray;
-maui-shell-tabbar-unselected Element | initial -maui-shell-tabbar-unselected: cyan;
-maui-shell-title Element | initial -maui-shell-title: teal;
-maui-shell-unselected Element 色の | initial -maui-shell-unselected: limegreen;

次の color 値がサポートされています。

  • X11 、CSS の色と .NET MAUI の色に一致します。 これらの色の値では、大文字と小文字が区別されません。
  • 16 進色: #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 の範囲です。

厚さ

1 つ、2 つ、3 つ、または 4 つの thickness 値がサポートされ、それぞれ空白で区切られます。

  • 1 つの値は、均一な厚さを示します。
  • 2 つの値は、垂直方向と水平方向の太さを示します。
  • 3 つの値は、top、horizontal (左と右)、下の太さを示します。
  • 4 つの値は、上、右、下、左の太さを示します。

手記

CSS thickness 値は、XAML Thickness 値とは異なります。 たとえば、XAML では、2 つの値 Thickness は水平方向と垂直方向の太さを示し、4 つの値 Thickness は左、上、右、下の太さを示します。 さらに、XAML Thickness 値はコンマで区切られます。

関数

線形グラデーションと放射状グラデーションは、それぞれ linear-gradient() および radial-gradient() CSS 関数を使用して指定できます。 これらの関数の結果は、コントロールの background プロパティに割り当てる必要があります。