Visual Studio 2017 で Xamarin する(4)イベント処理

Aboutボタンの処理を書く

Activityの定義は完全にテンプレートのままで問題なかった。 AndoridプロジェクトのMainActivity → 共通のApp.xaml → 共通のMainPage.xaml のように呼び出しているようだ。 次は、イベント処理を書いてみる。

<Button
    Text="{x:Static properties:Resources.About}" 
    Clicked="About_Clicked"/>

Clicked= でイベントハンドラを追加する。適当に名前を付けて、F12キー(定義へ移動)で空の関数が作成されてナイス。

ダイアログの表示は、DisplayAlertメソッドを使うのだがこれはPageオブジェクトのメソッドだ。 FragmentMainはPageではないので、無理やり実装するとこんな感じか。

  • FragmentMain.xaml.cs
private void About_Clicked(object sender, EventArgs e)
{
    ((Page)this.Parent.Parent).DisplayAlert("About Ultimate Tic Tac Toe", "This game is...", "OK");
}

さすがにひどい。 MainPage側でコントロールのイベントをハンドルしてやればよさそう。

まず、ボタンを識別するために名前を設定する。

<Button
    x:Name="About_Button"
    Text="{x:Static properties:Resources.About}" />

親から子を識別できるように FragmentMain にも名前を設定する。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TicTacToe"
             x:Class="TicTacToe.MainPage">

    <Frame VerticalOptions="Center"
           HorizontalOptions="Center">
        <local:FragmentMain
            x:Name="fragment_main"/>
    </Frame>
</ContentPage>

MainPageでハンドルする

public MainPage()
{
    InitializeComponent();
    this.fragment_main.About_Button.Clicked += AboutButton_Clicked;
}

しかし、About_Buttonが見えない。「アクセスできない保護レベルになっています」と怒られる。

名前のほかに何かないかと探すと、FieldModifier といういかにもな属性がある。

<Button
    x:Name="About_Button"
    x:FieldModifier="internal"
    Text="{x:Static properties:Resources.About}" />

のように書き換えてみたが、やはりAbout_Buttonが見えない。この属性は無効っぽいのでプロパティでボタンを公開してやる

  • FragmentMain.xaml.cs
internal Button AboutButton { get { return About_Button; } }
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        fragment_main.AboutButton.Clicked += AboutButton_Clicked;
    }

    private void AboutButton_Clicked(object sender, EventArgs e)
    {
        DisplayAlert("About Ultimate Tic Tac Toe", "This game is...", "OK");
    }
}

実行してみる

Android

f:id:foohogehoge:20170408233036p:plain:h600

UWP

f:id:foohogehoge:20170408233200p:plain:w600

タイトルが二重に表示されるのがちょっとダサい。

なんとかモノになりそうな気がしてきましたよ。

参考

Xamarin.Formsでダイアログボックス(とBusyインジケーター)を表示するには? - Build Insider

[Xamarin.Forms] x:FieldModifier が使えない? | rksoftware

x:FieldModifier — Xamarin Forums