Visual Studio 2017 で Xamarin する(4)イベント処理
Aboutボタンの処理を書く
Activityの定義は完全にテンプレートのままで問題なかった。 AndoridプロジェクトのMainActivity → 共通のApp.xaml → 共通のMainPage.xaml のように呼び出しているようだ。 次は、イベント処理を書いてみる。
- FragmentMain.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側でコントロールのイベントをハンドルしてやればよさそう。
まず、ボタンを識別するために名前を設定する。
- FragmentMain.xaml
<Button x:Name="About_Button" Text="{x:Static properties:Resources.About}" />
親から子を識別できるように FragmentMain にも名前を設定する。
- MainPage.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" xmlns:local="clr-namespace:TicTacToe" x:Class="TicTacToe.MainPage"> <Frame VerticalOptions="Center" HorizontalOptions="Center"> <local:FragmentMain x:Name="fragment_main"/> </Frame> </ContentPage>
MainPageでハンドルする
- MainPage.xaml.cs
public MainPage() { InitializeComponent(); this.fragment_main.About_Button.Clicked += AboutButton_Clicked; }
しかし、About_Buttonが見えない。「アクセスできない保護レベルになっています」と怒られる。
名前のほかに何かないかと探すと、FieldModifier といういかにもな属性がある。
- FragmentMain.xaml
<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; } }
- MainPage.xaml.cs
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
UWP
タイトルが二重に表示されるのがちょっとダサい。
なんとかモノになりそうな気がしてきましたよ。
参考
Xamarin.Formsでダイアログボックス(とBusyインジケーター)を表示するには? - Build Insider