第 6 章の概要: ボタンのクリック

Note

この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。

Button は、ユーザーがコマンドを開始するためのビューです。 Button は、テキスト (および必要に応じて、「第 13 章、ビットマップ」で示されているように画像) によって識別されます。 そのため、Button では Label と同じプロパティの多くが定義されています。

また、Button では、境界線の外観を制御する 3 つのプロパティも定義されていますが、これらのプロパティと相互の独立性のサポートはプラットフォーム固有です。

Button では、BackgroundColorHorizontalOptionsVerticalOptions など、VisualElement および View のすべてのプロパティも継承されます。

クリックの処理

Button クラスで定義されている Clicked イベントは、ユーザーが Button をタップしたときに発生します。 Click ハンドラーは EventHandler 型です。 最初の引数は、イベントを発生させる Button オブジェクトです。2 番目の引数は、追加情報を提供しない EventArgs オブジェクトです。

ButtonLogger サンプルでは、簡単な Clicked の処理が示されています。

ボタンのクリックの共有

複数の Button ビューで同じ Clicked ハンドラーを共有できますが、通常、ハンドラーでは特定のイベントに対応する Button を特定する必要があります。 1 つの方法は、さまざまな Button オブジェクトをフィールドとして格納し、ハンドラーでイベントを発生させているものを調べることです。

TwoButtons サンプルでは、この手法が示されています。 そのプログラムでは、Button の押下が有効ではなくなったときに、ButtonIsEnabled プロパティを false に設定する方法も示されています。 無効な Button では、Clicked イベントは生成されません。

匿名イベント ハンドラー

ButtonLambdas サンプルで示されているように、Clicked ハンドラーを匿名ラムダ関数として定義できます。 ただし、匿名ハンドラーは、面倒なリフレクション コードを使用しないと共有できません。

ID によるビューの区別

StyleId プロパティまたは AutomationId プロパティを string に設定することにより、複数の Button オブジェクトを区別することもできます。 このプロパティは Element で定義されていますが、Xamarin.Forms では使用されていません。 アプリケーション プログラムによる使用のみが想定されています。

SimplestKeypad サンプルでは、テンキーの 10 個の数字キーすべてに同じイベント ハンドラーを使用し、それらを StyleId プロパティで区別しています。

最も簡単なキーパッドのトリプル スクリーンショット

一時的なデータの保存

多くのアプリケーションでは、プログラムが終了されるときにデータを保存し、プログラムが再び開始されるときにそのデータを再度読み込む必要があります。 Application クラスでは、プログラムで一時的なデータを保存および復元するのに役立ついくつかのメンバーが定義されています。

  • Properties プロパティは、string キーと object 項目のディクショナリです。 ディクショナリの内容は、プログラムの終了前にアプリケーションのローカル ストレージに自動的に保存され、プログラムの起動時に再度読み込まれます。
  • Application クラスでは、プログラムの標準の App クラスでオーバーライドされる次の 3 つの保護された仮想メソッドが定義されています: OnStartOnSleepOnResume。 これらでは、"アプリケーション ライフサイクル" イベントが参照されています。
  • SavePropertiesAsync メソッドでは、ディクショナリの内容が保存されます。

SavePropertiesAsync を呼び出す必要はありません。 ディクショナリの内容は、プログラムの終了前に自動的に保存され、プログラムの起動前に取得されます。 プログラムをテストするとき、プログラムがクラッシュした場合にデータを保存するのに便利です。

次のものも便利です。

  • Application.Current は現在の Application オブジェクトを返す静的プロパティで、Properties ディクショナリを取得するために使用できます。

最初のステップは、プログラムの終了時に保持する必要がある、ページ上のすべての変数を識別することです。 それらの変数が変更されるすべての場所がわかっている場合は、その時点で Properties ディクショナリに追加するだけで済みます。 ページのコンストラクターでは、キーが存在する場合は Properties ディクショナリから変数を設定できます。

大規模なプログラムでは、おそらく、アプリケーション ライフサイクル イベントを処理する必要があります。 最も重要なものは、OnSleep メソッドです。 このメソッドの呼び出しは、プログラムがフォアグラウンドではなくなったことを示します。 おそらく、ユーザーがデバイスのホーム ボタンを押したか、すべてのアプリケーションを表示したか、または電話をシャットダウンしている可能性があります。 OnSleep の呼び出しは、プログラムが終了する前に受け取る唯一の通知です。 プログラムでは、この機会を利用して、Properties ディクショナリを最新の状態にする必要があります。

OnResume の呼び出しは、プログラムが最後の OnSleep の呼び出しの後で終了せず、もう一度フォアグラウンドで実行していることを示します。 プログラムでは、この機会を利用して、(たとえば) インターネット接続を更新することができます。

OnStart の呼び出しは、プログラムの起動中に発生します。 このメソッドが呼び出されるまで、Properties ディクショナリのアクセスを待つ必要はありません。内容は、App コンストラクターが呼び出されたときに既に復元されています。

PersistentKeypad サンプルは SimplestKeypad と非常によく似ていますが、そのプログラムでは OnSleep のオーバーライドを使用して現在のキーパッド入力を保存し、ページ コンストラクターを使用してそのデータを復元している点が異なります。

Note

プログラムの設定を保存するもう 1 つの方法が、Xamarin.Essentials の Preferences クラスで提供されています。