Open2

[.NET MAUI] レスポンシブデザイン

GomitaGomita

XAMLの記述をiPhone SEの解像度(1,334×750ピクセル)に合わせておきつつも、iPad miniの解像度(2,266 x 1,488ピクセル)にもあうようにしたい。
https://pg-himajin.com/dotnet/maui/responsive-design/
MAUIでレスポンシブデザインを実装するには<VisualStateManager>を使用する。ウィンドウサイズが一定値を超えた場合、XAMLの各コンロトールのプロパティを変化させる、という考え方。

レンタカー予約画面のGridは3分割でヘッダーエリア、タイトルエリア、コンテンツエリアとなっているため、これら3つの<Grid>に対して<VisualStateManager>を差し込んで定義していく。
ウィンドウサイズが555以上(iPhoneの横幅375を超えていれば適当な値でOK)であれば、という条件を<VisualState.StateTriggers>で指定し、条件にマッチした場合にGridのWidthRequestをiPadの横幅に合わせて744に変更する、という条件分岐を<VisualState.Setters>で指定する。

MainPage.xml
        <!-- ▼ヘッダーエリア -->
        <Grid Grid.Row="0" BackgroundColor="#d5e4f2" WidthRequest="375">
+            <VisualStateManager.VisualStateGroups>
+                <VisualStateGroupList>
+                    <VisualStateGroup>
+                        <VisualState Name="iPad">
+                            <VisualState.StateTriggers>
+                                <AdaptiveTrigger MinWindowWidth="555" />
+                            </VisualState.StateTriggers>
+                            <VisualState.Setters>
+                                <Setter Property="WidthRequest" Value="744" />
+                            </VisualState.Setters>
+                        </VisualState>
+                    </VisualStateGroup>
+                </VisualStateGroupList>
+            </VisualStateManager.VisualStateGroups>

単純作業とはいえ1個1個のコントロールに対してXMLを入れ子にしていくので、コードの見通しが悪くなる。HTML+CSSの柔軟なデザインが恋しい気分だ。

とはいえ、Entryなどの標準コントロールをすべてContentViewによる独自コントールに置き換えていけば、<VisualStateManager>は独自コントールのContentVIew側で一括して設定できるので、それほど無理はないかもしれない。

まだ微調整は必要だけど、試しにレンタカー予約画面をiPadに対応させてみた。

GomitaGomita

XAMLのCSSでiPadの場合のみスタイルシートを読み込んでレスポンシブデザインできないか考えた。
https://learn.microsoft.com/ja-jp/dotnet/maui/user-interface/styles/css?view=net-maui-8.0

C#でiPadがどうかを判定するのは簡単。

if (DeviceInfo.Current.Name.StartsWith("iPad mini"))
{
    ...
}

少し調べた限りは難しそう。。。

  • CSSとはいえHTMLのように柔軟ではなく、非常に限定的なスタイルしか変更できない
  • XAMLの各コントロールで個別に設定された値をCSS側で!importantで上書きできない
  • Resourcesフォルダ内の*.cssのスタイルシートを動的に読み込む方法がわからない
  • こちらにある通り、cssファイルの中身の文字列をStringReaderから読み込む必要あり?