本サイトからスピンオフした姉妹サイトです。マルチプラットフォーム2014年7月23日Xamarin.Formsのコントロールにはプラットフォーム共通の基本的な機能しか含まれていない。既存のコントロールを拡張して、ネイティブ側で機能を追加する方法を解説。→Xamarin.Formsには40個以上のコントロールが用意されており、基本的な機能はカバーしているが、クロスプラットフォームに対応するために、最大公約数的な機能しか提供していない。今回は、既存のコントロールを拡張して、ネイティブ側で機能を追加する方法を解説する。シナリオXamarin.FormsのButtonコントロールは、クリック(Click)イベントは提供されているものの、“長押し”した時のイベントは提供されていない。このButtonに長押し時のLongTapイベントを追加する。Portable)]を選択し、ソリューション名を「LongTapButtonSample」として[OK]ボタンを押す。LongTapButtonSampleプロジェクトにLongTapButton.csファイルを追加し、以下のコードを追記する。EventArgs());}}}Buttonクラスを継承したLongTapButtonクラスのコード(LongTapButton.cs)このコードでは、Xamarin.FormsのButtonクラスを拡張してLongTapButtonクラスを作成し、イベントLongTapと、それを発生させるためのメソッドOnLongTapを実装している。本稿のサンプルでは、ボタンを1つ配置したページを作成する。そこでApp.csファイルには、LongTapButtonコントロールを配置するページを実装する。具体的には以下のコードのように修正する。button};}}LongTapButtonコントロール(=ボタン)を1つだけ配置したページのコード(App.cs)これで、プラットフォーム側を実装すれば、ボタンを長押しするとボタン名が変更される。Xamarin.Formsパッケージを更新するXamarin.Formsのソリューションを作成すると、各プロジェクトにXamarin.Formsパッケージが読み込まれるが、作成直後はバージョンが古い(執筆時点で「1.0.6186」)ので更新する。ここで解説するコントロールの拡張に関連するクラスは、古いパッケージでは動作しないので、必ず行う必要がある。パッケージの管理]ダイアログの[更新プログラム]で更新する。Packages]を選択すると(図1)、ソリューションに含まれる全てのパッケージが更新される。現在のバージョンは「1.2.1.6229」だ(図2)。AndroidでLongTapButtonの機能を実装するLongTapButtonSample.Androidプロジェクトに、LongButtonRenderer.csファイルを追加し、以下のコードのように実装する。←4formsButton.OnLongTap();}}}Android用の独自ButtonRendererの実装コード(LongButtonRenderer.cs)Xamarin.Formsの描画は、各コントロールに用意されているRendererによって行われており、Buttonの場合はButtonRendererがその役割を担う。1で、ButtonRendererクラスを拡張してLongTapButtonRendererクラスとして、Androidでの機能実装を行う。2が特に重要な要素で、このExportRenderer属性によって、「LongTapButtonコントロールの描画にはLongTapButtonRendererクラスを使用する」と定義している。Xamarin.Formsのフレームワークはこの属性を読み、コントロールの描画を委譲する。3を見ると分かるように、OnElementChangedメソッドのパラメーターであるElementChangedEventArgs<Button>オブジェクトのNewElementプロパティで、Xamarin.Forms側のコントロールが取得できる。ButtonRendererなのでButton型のオブジェクトが取得されるが、2の定義により、その実体は必ずLongTapButton型である。Android側のボタン(Android.Widget.Button)は、ButtonRendererオブジェクト(=this)のControlプロパティより取得できる。Android.Widget.ButtonにはLongClickイベントが備わっているので、このイベントハンドラーでLongTapButtonコントロールのLongTapイベントを発生させる(4)。ここまでのプログラムをAndroidで実行し、ボタンを長押しすると、次の画面のようになる。iOSでLongTapButtonの機能を実装するiOS側も実装もAndroid側と同じ要領だ。LongTapButtonSample.iOSプロジェクトに、LongButtonRenderer.csファイルを追加し、以下のコードのように実装する。UIGestureRecognizerState.Recognized){formsButton.OnLongTap();}}));}}}iOS用の独自ButtonRendererの実装コード(LongButtonRenderer.cs)Android側とほとんど同じコードである。異なるのはiOSなのでButtonRenderer.Controlプロパティから取得できるのがUIButton型のオブジェクトであること、UIButtonにはLongClickのようなイベントがないので、UILongPressGestureRecognizerクラスを使って長押しを検知していることだ。ここまでのプログラムをiOSで実行し、ボタンを長押しすると、次の画面のようになる。実行画面(iOS)まとめRendererを拡張することで、Xamarin.Formsの既存のコントロールを容易に拡張できる。このRendererの仕組みは、新しいコントロールを作成したり、画面(Page)すらも制御したりできる。これらの方法は次回以降、取り上げていきたい。他のクロスプラットフォーム開発ツールでも、既存の部品に足りない機能をネイティブ側に委譲する仕組みは存在するが、Java言語やObjective-C言語など、ネイティブの開発言語・開発ツールで作成する必要があり、アプリと共にデバッグすることができない(また、アプリとの「つなぎ」が一番トラブルになりやすい)。Xamarin.Formsは、Xamarin.Android、Xamarin.iOSが提供するネイティブSDKの.NETラッパーが利用できるので、同じ言語で、同じソリューション内でデバッグしながら開発できるのが大きなメリットだ。Xamarin(英語)」を参照されたい。final」とある通り、今後、APIが変更される可能性があることを留意いただきたい。※以下では、本稿の前後を合わせて5回分(第10回~第14回)のみ表示しています。INDEX]を参照してください。Xamarin.Formsでカスタムダイアログを表示するには?(MessagingCenter利用)Xamarin.Formsで共通のAPIが提供されているダイアログ(=iOSのUIAlertView/AndroidのAlertDialog)以外のプラットフォーム個別のダイアログを表示する方法を解説。その呼び出しにはMessagingCenterが利用できる。Studioを立ち上げる方法を説明する。Xamarin.Formsの既存のコントロールを拡張するには?Xamarin.Formsのコントロールにはプラットフォーム共通の基本的な機能しか含まれていない。既存のコントロールを拡張して、ネイティブ側で機能を追加する方法を解説。Xamarin.Formsで新しいコントロールを作成するには?Xamarin.Formsでは、既存のコントロールを拡張できるだけでなく、全く新しいコントロールを作成することもできる。その内部には、iOS/Androidで違うコントロールを含めたりできる。StudioのiOSデザイナーを使用して行う方法を解説。コードで画面遷移を実装する方法も説明する。機械学習エンジニアを目指す人~初中級者のための技術情報サイトです。2023最適なビューへの切り替えを推奨します:スマートフォン用表示に。