SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windowsで進化するマルチプラットフォームGUI開発

初めての.NET MAUIアプリを作ってみよう【マルチプラットフォームGUI技術を解説】

Windowsで進化するマルチプラットフォームGUI開発 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

インストールと最初のプロジェクト

 この連載では、主にWindowsOSでのインスト-ル、開発方法を解説します。なお、あくまでも現時点での情報です。正式リリース時には、変更される点があることはご了承ください。

Visual Studio 2022

 まずは、Visual Studio 2022 version 17.2 Preview 4をインストールします。ダウンロードするか、Previewリリースがインストール済みならVisual Studioインストーラーで最新版に更新します。なお、インストール途中のワークロードの選択では、「.NETによるモバイル開発」も選択しておきます。

ワークロードの選択
ワークロードの選択

Android開発環境

 Androidアプリ開発に必要な、Android SDKやAndroid エミュレーターについては、別途インストールする必要はありません。Visual Studio上から必要に応じてインストールすることができます。またすでにAndroid SDKなどがインストールされている状態であれば、その情報をひきついで利用することができます。

最初のプロジェクト作成

 それでは、プロジェクトを作成してみましょう。Visual Studioで新しいプロジェクトの作成を選び、プロジェクトテンプレートに.NET MAUI アプリを選択します。

新しいプロジェクトの作成
新しいプロジェクトの作成

 プロジェクト名や場所などは適宜変更してください。

新しいプロジェクトの構成
新しいプロジェクトの構成

プロジェクトのフォルダー構成

 新規作成されたプロジェクトのファイル/フォルダー構成は、次のようになっています。

ファイル/フォルダー構成
ファイル/フォルダー構成
\Propties
 \launchSettings.json  ----- 起動のためのプロファイル
\Platforms              ----- 各環境固有の処理をまとめたフォルダー
 \Android              ----- Android用
  \MainActivity.cs    ----- Activityクラス
  \MainApplication.cs ----- エントリポイント
 \iOS                  ----- iOS用
 \MacCatalyst          ----- macOS用
 \Windows              ----- Windows用
  \App.xaml
  \App.xaml.cs        ----- エントリポイント
\Resources              ----- アプリで使用する画像やフォントなどのリソース
 \Style.xaml           ----- アプリ内で使用する文字色や背景色の定義
App.xaml                ----- Style定義の指定
 App.xaml.cs           ----- MainPageプロパティの設定
AppShell.xaml           ----- Shellページの定義
MainPage.xaml           ----- メイン画面となるページクラスの定義
 MainPage.xaml.cs      ----- メイン画面のイベント処理など
MauiProgram.cs          ----- アプリのエントリポイント

 マルチプラットフォームに対応したアプリながら、1つのプロジェクトで各環境に対応できるようになっているため、プロジェクトの構造としてはシンプルな形になっています。Platformsフォルダー以下に各環境固有の処理がまとめられ、それ以外のフォルダー/ファイルは、共通で使用するものです。

 Platformsフォルダー以下には、さらに各環境の名前のフォルダーがあります。主にアプリ起動時の処理や各環境に合わせたアプリの設定を記述します。アプリをビルドする際は、環境に応じてPlatforms以下のフォルダー1つだけが参照されます。

アプリのクラス構成と起動処理

 生成されたアプリでは、Microsoft.Maui.Controls.Applicationクラスを継承したAppクラスが定義されています。Appクラスがアプリ全体を定義するものとなります。.NET MAUIでは、.Net汎用ホストというクラスを用いて、このAppクラスをインスタンス化するようになっています。汎用ホストとは、ログの記録などの汎用的な処理やアプリの設定を管理するクラスです。

 MauiProgram.csから、フォントの設定を除くと、次のようなコードとなります。

[リスト1]MauiProgram.cs
public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder.UseMauiApp<App>();
        return builder.Build();
    }
}

 CreateMauiApp()メソッドが実行されることで、Appクラスがインスタンス化されます。では、このCreateMauiApp()メソッドがどこから実行されるのかですが、それはPlatforms以下にある各環境のアプリ起動処理から呼び出されます。Windowsであれば、Platforms\WindowsフォルダにあるApp.xaml.csのCreateMauiApp()メソッドが、MauiProgramクラスのCreateMauiApp()メソッドを呼び出します。

[リスト2]App.xaml.cs
public partial class App : MauiWinUIApplication
{
    public App()
    {
        this.InitializeComponent();
    }
    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

 なお、ここで定義されているAppクラスはアプリ自体を示すAppクラスではありません。Windows環境固有で使用されるクラスです。

Appクラス

 マルチプラットフォームに対応するため、複雑な起動処理になっていますが、通常のアプリを作成するのであればあまり意識する必要はないでしょう。

 次に、アプリ全体を示すAppクラスを見てみましょう。こちらは、各環境で共通のクラスとなります。Appクラスは、XAMLファイル(App.xaml)で定義されています。WPF(Windows Presentation Foundation)やXamarinを使ったプロジェクトに触れたことがあれば、XAMLはおなじみでしょう。

 .NET MAUIでも、画面設計をXAMLで記述して、イベント処理やビジネスロジックなどはC#で記述します。XAMLでは、HTMLのような静的な要素の配置だけでなく、UIコントロールの制御といった動的な処理も記述することができます。C#コードの部分は、~.xaml.csというファイルとなります。App.xamlであればApp.xaml.csです。

 なお、XAMLは、画面設計だけに用いられるものではありません。XAMLは、(CLR)オブジェクトを生成するための言語です。App.xamlファイルも、画面設計のファイルではなく、アプリで利用するStyle定義ファイルの指定と、ApplicationクラスのメンバーであるMainPageプロパティの設定になっています。MainPageプロパティは、その名前のとおりアプリのベースとなる画面(Page)クラスのインスタンスを指定するものです。

MainPageクラス

 自動生成されたアプリでは、MainPageに(Shellページクラス継承した)AppShellクラスのインスタンスを指定しています。さらにAppShellクラスの定義で、アプリのメイン画面を定義したMainPageクラスを設定しています。MainPageクラスは、MainPage.xaml、MainPage.xaml.csで定義されています。

 XAMLでは、XMLの記法の要領で、<UI要素>というタグで指定し、その属性でUI要素のプロパティを指定します。例えば、MainPage.xamlではLabelコントロールが定義されています。

[リスト3]MainPage.xaml
<Label 
    Text="Current count: 0"
    FontSize="18"
~略~
     />

 Textプロパティでは表示するテキスト、FontSizeプロパティではフォントのサイズの指定になります。

MainPageの構造

 MainPage.xamlから各コントロールの属性を省略すると、次のような構造になっています。

[リスト4]MainPage.xaml
<ContentPage>
    <ScrollView>
        <VerticalStackLayout>
            <Label />
            <Button />
            <Image />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

 .NET MAUIでのアプリは、1つ以上のページクラスで構成されます。またページには通常、1つ以上のレイアウトコントロールが含まれます。ContentPageコントールのなかにScrollViewコントールがあり、そのなかでVerticalStackLayoutコントールを定義して、Labelコントロ-ルとImageコントロールを配置しています。

 ContentPageコントールは、1つのビュー(またはレイアウト)を表示する、最も一般的なページコントロールです。レイアウトは、ユーザーインターフェースの構造(位置、サイズ)を定義するものです。レイアウトには通常、複数の子コントロールが含まれています。

 Labelコントロ-ルは、文字の表示、Buttonコントロールは、ボタン表示、Imageコントロ-ルは、画像を表示するUIコントロールです。MainPage.xaml.csには、イベント処理が記述されています。このファイルについては、後述することにします。

Windowsアプリ

 まず、Windowsデスクトップアプリとして動作するか、試してみましょう。実行環境をWindows Machineに変更してから、緑の▶をクリックするか、メインメニューのデバッグからデバッグの開始を選択します。

実行環境の変更
実行環境の変更

 すると、次のようなアプリが起動します。アプリの背景色は、Windowsのカラーモード設定に応じて、黒または白になります。

Windowsアプリ
Windowsアプリ

 アプリのClick meと書かれたボタンをクリックすると、ボタンの上に表示された数値が1つずつ増加します。またその数値は、アプリだけでなく、Visual Studio内に表示されたプレビューもリアルタイムに同期して変更されます。

 

リアルタイムプレビュー
リアルタイムプレビュー

 また、.NET MAUI アプリでの開発でも、ホットリロード機能が利用できます。ホットリロードとは、アプリケーションを実行したままでコードの変更がリアルタイムに反映される仕組みです。試しに、MainPage.xamlに定義されたLabelプロパティの文字列を変更してみましょう「World!」を「MAUI」に書き換えると、すぐにアプリとプレビュー内の文字が変更されるはずです。

ホットリロード
ホットリロード

Androidアプリ

 今度は、Androidアプリとして実行してみましょう。最初に、Android SDKを確認します。Visual Studioのツールメニューから[Android]ー[Android SDK Manager]を選択します。Android SDK Managerでは、Android開発に必要なSDK一式のインストール、更新が可能です。SDKがまだインストールされていない環境では、Visual Studioのインストーラーで自動的にインストールされているはずです。更新情報がある場合は[変更の適用]ボタンを押すと、ファイルがダウンロードされて更新されます。

Android SDK Manager
Android SDK Manager

 次に、ツールメニューの[Android]ー[Android Device Manager]を選択します。ここでは、Windows上で動作するAndroidエミュレーターを作成します。Androidのアプリ開発では、Androidスマートフォンなどの実機をPCに接続して開発することも可能です。最終的には、実機での動作確認が必要となってきますが、開発の段階では実機ではなく、一般にAndroidエミュレーターを利用します。

 Androidデバイスには、Androidのバージョンや画面サイズ、解像度などさまざまなデバイスがあります。Androidエミュレーターでは、Androidデバイスを仮想的に作成することができるため、いろいろなデバイスでの動作を確認することができます。

 今回は、Androidのバージョンが12で、Google Pixel 4aというスマートフォンのエミュレーターを作成しています。

Android Device Manager
Android Device Manager

 Newボタンで新規作成、Editで設定の変更が可能です。Editを選択した場合は、次のような画面が表示されます。CPUの設定やセンサーのエミュレート有無など、主にハードウェアに関する設定が可能です。

エミュレーター
エミュレーター

 このあたりの設定は、Androidアプリ開発経験者であれば、おなじみのものでしょう。

Androidエミュレーターでの実行

 今度は、Visual Studioの実行環境をAndroidエミュレーターにして、デバッグを開始します。

エミュレーターの選択
エミュレーターの選択

 しばらくすると、Androidエミュレーターが起動してアプリが実行されます。

エミュレーターで実行
エミュレーターで実行

 もちろんAndoridエミュレーターでも、ホットリロード機能が使えます。モバイル(Andorid)開発では、エミュレーターの起動やアプリの実行にやや時間がかかるので、ホットリロードは特に便利な機能と言えるでしょう(なお、RC1バージョンのテンプレトートアプリの設定では、文字が切れる場合があります。その場合は、MainPage.xamlにあるLabelコントロールのFontSizeプロパティを小さい値に変更します)。

最後に

 今回は、マルチプラットフォームに対応したUIフレームワークである、.NET MAUIのインストールと、自動生成されるテンプレートプロジェクトを解説しました。次回は、このテンプレートのプロジェクトに新規画面を追加してアプリを作成してみることにします。

参考文献

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Windowsで進化するマルチプラットフォームGUI開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15907 2022/05/23 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング