創作世界のいろいろ〜AdobeとかC#とか

絵を描く人がC#とか3Dとか動画編集とかやる為の備忘録

【MAUI】スタイルを統一して設定する(詳細記事)

 

matsrikagraphic.hatenablog.com

上の記事が読まれてるようなので詳細記事を書こうと思います。

自分用にも備忘録として

 

スタイルの設定を統一する方法①

新規作成したら初めからある「Styles」というフォルダを開くと、二つのcsファイルがあると思います。ここにある既存のcsファイルを編集するのが一つ目の方法です。

Colorsは、各色に名前をつけて同じ色を呼び出すために設定したものです。

テンプレの紫色も、ここで設定されています。

<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

    <Color x:Key="Primary">#512BD4</Color><!--←これがあの紫色-->
    <Color x:Key="Secondary">#DFD8F7</Color>
    <Color x:Key="Tertiary">#2B0B98</Color>
    <Color x:Key="White">White</Color>
    <Color x:Key="Black">Black</Color>

 

なので、ここの"Primary"の色#512BD4を好きな色に変えると、紫の色を別の色に変えられます。

 

Stylesは、形状や色の設定をまとめる色です。

たとえばこの中には<Button>に対するスタイル設定もあります。

<Style TargetType="Button">
        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
        <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
        <Setter Property="FontFamily" Value="OpenSansRegular"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="CornerRadius" Value="8"/>
        <Setter Property="Padding" Value="14,10"/>
        <Setter Property="MinimumHeightRequest" Value="44"/>
        <Setter Property="MinimumWidthRequest" Value="44"/>
        <Setter Property="VisualStateManager.VisualStateGroups">
            <VisualStateGroupList>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="Disabled">
                        <VisualState.Setters>
                            <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
                            <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateGroupList>
        </Setter>
    </Style>

 

よく見ると、BackgroundColorの設定があると思います。

        <Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />

ここに、アプリテーマがライトカラーの場合は、{StaticResource Primary}に色を指定すると記述しているため、ボタンの色があの紫色になります。

 

スタイルの設定を統一する方法②

二つ目の方法は、各ページの上部に<Style>タグを記述する方法です。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MCATSystem0515.MVVM.Views.StyleChange"
             Title="StyleChange">

    <!--Styleの設定をここに記述します。-->
    <ContentPage.Resources>
        <Style TargetType="Button">
            <Setter Property="BackgroundColor" Value="Black"/>
            <Setter Property="CornerRadius" Value="0"/>
            <Setter Property="WidthRequest" Value="150"/>
        </Style>
    </ContentPage.Resources>


    <!--実際のコンテンツ-->
    <VerticalStackLayout VerticalOptions="Center">
        <Button Text="Add"/>

    </VerticalStackLayout>
</ContentPage>

これを再生してみると、以下のような見た目になります。

<Button>には、Textの設定しかしていませんが、ページ上部に設定しているStyleが自動で呼び出されます。

<Button>を数パターンで見た目を変えたい場合は、x:Keyを使います。

<!--Styleの設定をここに記述します。-->
    <ContentPage.Resources>
        <Style TargetType="Button" x:Key="Black">
            <Setter Property="BackgroundColor" Value="Black"/>
            <Setter Property="CornerRadius" Value="0"/>
            <Setter Property="WidthRequest" Value="150"/>
            <Setter Property="Margin" Value="0,2"/>
        </Style>
        <Style TargetType="Button" x:Key="White">
            <Setter Property="BackgroundColor" Value="White"/>
            <Setter Property="BorderColor" Value="Black"/>
            <Setter Property="BorderWidth" Value="1"/>
            <Setter Property="TextColor" Value="Black"/>
            <Setter Property="CornerRadius" Value="0"/>
            <Setter Property="WidthRequest" Value="150"/>
            <Setter Property="Margin" Value="0,2"/>
        </Style>

    </ContentPage.Resources>


    <!--実際のコンテンツ-->
    <VerticalStackLayout VerticalOptions="Center">
        <Button Text="Add" Style="{StaticResource Black}"/>
        <Button Text="Delete" Style="{StaticResource Black}"/>
        <Button Text="Add" Style="{StaticResource White}"/>
        <Button Text="Delete" Style="{StaticResource White}"/>


    </VerticalStackLayout>
</ContentPage>

 

これを再生すると以下のようになります。

個別に色々と設定をしたコンテンツが増えていくとコードが見にくくなりますが、上部にまとめればスッキリします。

二行に跨がずに済むのがすごく良い。

また、一部だけスタイルを変更したい場合は、個別設定が優先されるので、変えたいタグに直接記述すれば良いです。

<Button Text="Add" Style="{StaticResource White}"
                TextColor="Red"/>

こんな感じ



Styleは、LabelやButtonだけでなく、Layoutなどにも設定可能なので、位置構成をまとめて設定したいときも便利です。動的な部分(Entryの入力中の背景色とか)も全てではないですが設定できます。

もっというと、既存のStyles.csと同じようにオリジナルのcsを新規に作成して、そこに全てのスタイルをまとめて記述することもできます。それはまた後日記事にしようと思います。(ただしmacだけなのか、うまく新規に作った.csを見つけてくれないときがあるので注意)