【Xamarin】【book】「Xamarin エキスパート養成読本」の学習記録(1) [巻頭特集]

下記の「Xamarin エキスパート養成読本」を使った学習記録のページです。
Xamarinエキスパート養成読本 (Software Design plus)
 

 

環境

「Xamarin エキスパート養成読本」は Visual Studio 2015 で記載されているため、私が使用した Visual Studio 2017 とは若干操作手順が異なる。

  • Windows 10
  • Visual Studio 2017

 
 

触れてみよう Xamarin の世界

プロジェクトの新規作成

「ファイル」-「新規作成」-「プロジェクト」-「新しいプロジェクト」より、以下のように「Cross-Platform」から「モバイルアプリ」を選択し、「Blank App」を選ぶ。
f:id:dnkrnka:20181010224027p:plain:w600
f:id:dnkrnka:20181010223741p:plain:w600
 
次のようにプロジェクトが作成された。
f:id:dnkrnka:20181010224632p:plain:w600
 
 

共通画面の作成

PCL*1プロジェクトである「StartXamarin」を右クリックし、「追加」「新しい項目」を選択する。
f:id:dnkrnka:20181010230920p:plain:w600
 
「Visual C#アイテム」-「Xamarin.Forms」-「コンテンツページ」を選択し, SamplePage.xaml というファイル名を付けると、以下のように SamplePage.xaml と SamplePage.xaml.cs が作成された。
f:id:dnkrnka:20181010232606p:plain
 

SamplePage.xaml の実装
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="StartXamarin.SamplePage">
    <StackLayout>
        <Label x:Name="text1" Text="文字を入力してください" />
        <Entry x:Name="entry1" Text="" />
        <Button x:Name="btn1" Text="クリック!">
            <Button.Triggers>
                <DataTrigger TargetType="Button" Binding="{Binding Source={x:Reference entry1},Path=Text.Length}" Value="0">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Button.Triggers>
        </Button>
    </StackLayout>
</ContentPage>

 

共通ロジックの作成

画面で文字を入力し、ボタンをクリックしたらラベル上に入力した文字を表示させる という処理をする。

SamplePage.xaml.cs の実装

★1 で Xaml で定義したボタンが押されたら、★2 で Entry に入力された文字を Label に表示する。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace StartXamarin
{
  [XamlCompilation(XamlCompilationOptions.Compile)]
  public partial class SamplePage : ContentPage
  {
    public SamplePage()
    {
      InitializeComponent();
      this.btn1.Clicked += Btn1_Clicked;  // ★1
    }
    private void Btn1_Clicked(object sender, EventArgs e) // ★2
    {
      this.text1.Text = "「" + this.entry1.Text + "」が入力されました";
    }
  }
}

 

メインページの実装

Xaml で作成したページをアプリ実行時にメインページとして表示させるために、PCL プロジェクトの App.xaml.cs でメインページの設定を行う。
なお、MainPage.xaml.cs も存在しているが、各ファイルの用途についてはこちらを参照。
 
★3 の処理によって、上記で作成した SamplePage.xaml を呼び出している。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace StartXamarin
{
  public partial class App : Application
  {
    public App()
    {
      // The root page of your application
      MainPage = new SamplePage(); // ★3
    }

    protected override void OnStart()
    {
      // Handle when your app starts
    }

    protected override void OnSleep()
    {
      // Handle when your app sleeps
    }

    protected override void OnResume()
    {
      // Handle when your app resumes
    }
  }
}

 

ビルド

メニュの 「ビルド」- 「ソリューションのビルド」を選択する。
今回のビルドログは以下のようになった。
Warning はいくつかあるが、末尾のログより「4 正常終了」とあることから、ビルド自体は成功している模様。

1>------ ビルド開始: プロジェクト: StartXamarin, 構成: Debug Any CPU ------
1>StartXamarin -> C:\Users\neko\source\repos\StartXamarin\StartXamarin\StartXamarin\bin\Debug\netstandard2.0\StartXamarin.dll
2>------ ビルド開始: プロジェクト: StartXamarin.Android, 構成: Debug Any CPU ------
Mac とのペアリングが接続していないため、ビルドはオフラインで実行されます。フルビルドを実行するには、接続してからもう一度お試しください。
3>------ ビルド開始: プロジェクト: StartXamarin.iOS, 構成: Debug iPhoneSimulator ------
4>------ ビルド開始: プロジェクト: StartXamarin.UWP, 構成: Debug x86 ------
3>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\iOS\Xamarin.Messaging.targets(41,3): warning VSX1000: MSBuild には、リモート サーバーへの接続を確立するための十分な情報が提供されていません。プロジェクト 'StartXamarin.iOS' はオフラインでのビルドを続行します
3>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\iOS\Xamarin.iOS.Common.After.targets(254,3): warning : Mac への使用可能な接続がないため、タスク ResolveUniversalTypeIdentifiers は実行されません
3>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\iOS\Xamarin.iOS.Common.targets(1152,3): warning : Mac への使用可能な接続がないため、タスク Xamarin.MacDev.Tasks.CollectBundleResources は実行されません
3>  StartXamarin.iOS -> C:\Users\neko\source\repos\StartXamarin\StartXamarin\StartXamarin.iOS\bin\iPhoneSimulator\Debug\StartXamarin.iOS.exe
3>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\iOS\Xamarin.Messaging.targets(82,3): warning : 取得できる現在のビルド接続はありません。ビルド接続を最初に作成する必要があります
4>  StartXamarin.UWP -> C:\Users\neko\source\repos\StartXamarin\StartXamarin\StartXamarin.UWP\bin\x86\Debug\StartXamarin.UWP.exe
4>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\VisualStudio\v15.0\AppxPackage\Microsoft.AppXPackage.Targets(2492,5): warning APPX0104: 証明書ファイル 'StartXamarin.UWP_TemporaryKey.pfx' が見つかりません。
4>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\VisualStudio\v15.0\AppxPackage\Microsoft.AppXPackage.Targets(2492,5): warning APPX0107: 指定された証明書は署名に使用できません。有効な証明書の詳細については、http://go.microsoft.com/fwlink/?LinkID=241478 を参照してください。
2>  StartXamarin.Android -> C:\Users\neko\source\repos\StartXamarin\StartXamarin\StartXamarin.Android\bin\Debug\StartXamarin.Android.dll
2>  "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" と "mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" の間の競合を解決する方法がありません。一時的に、"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" を選択します。
========== ビルド: 4 正常終了、0 失敗、0 更新不要、0 スキップ ==========

 

アプリの実行

エミュレータの起動

メニュから「デバッグ」-「デバッグなしで開始」を選択すると、(2分ほど経過後に) 以下のようにエミュレータが起動した。
下図中の (1) が Label, (2) が Entry, (3) が Button である。
(3) の Button が非アクティブとなっているのは (2) Entry が未入力のためであり、この挙動は SamplePage.xaml で定義している。
 
f:id:dnkrnka:20181011001640p:plain
 

エミュレータの実行

マウスを使ってキーを押下し、「nekochan」と入力後に「クリック!」を押すと以下のようになった。
f:id:dnkrnka:20181011001120p:plain:w400
 

HAXM

HAXM というツールを導入すると、エミュレータ起動が遅い問題を改善することができる模様。

*1:プラットフォームに依存しない部分を共通化したライブラリのこと