はじめに
11月の下旬に Xamarin.Forms 2.3.3 がリリースされました。
内容は予定通り 新機能の Native View
です。
その 2.3.3のリリースに合わせ、Xamarinの公式サイトでは
Xamarin.Forms の欄に2つの項目が追加されました。
今回はそれを読みつつ記事を書いていくつもりです。
Native View
Native Viewは名前の通り 各プラットフォーム(iOS,Android,UWP)のAPIを
共通のプロジェクトである、 PCL の xaml で呼び出して使うことができます (Xamarinでは, 各プラットフォームのことをNativeといいます)。
iOSだったら UIKit Androidだったら widget 等々を呼び出してコーディングすることができます。
もちろん各プラットフォームごと呼び出されるので、お互いに影響することはできません。
例えば StackLayout で ios:UILabel androidWidget:TextView win:TextBlock
と順番に宣言したとしても
StackLayout の Children は1つです。
使用方法
簡単です。
使いたい Xaml におまじないを書くだけです。公式の説明では画像のとおりです
ポイントとして
なぜ、各プラットフォームごとでコンパイルされるかというと
各宣言の末にある targetPlatform=
でパッケージごとに分けてあげています。
この targetPlatform
を見てくれてるわけです。
そして実際に宣言するときは
と宣言してあげれば、あとは自由に使えます。簡単ですね。
※ xmlnsでの宣言は使いたい assembly を指定します。
ある程度の Xamarin 独特の知識が必要ですが、大体各プロジェクトに入っているのでそれを見ればいいと思います。
例えば Android なら Widget だけなら問題ないのですが、 Graphics は別 assembly ですので忘れないよう注意が必要です。
Yes バインディング No コードビハインド
じつは Native View には弱点があります。それはコードビハインドが現状使えないことです。
考えてみると納得ですが、そもそも assembly の指定を切り替えて実現しています。
UILabel に x:Name
と付けてもこれが UILabel であるために
コーディングではどうしようもありません。そこで Binding です。
Label.Text = "テキスト"
とやりたい気持ちを抑え、
xamlで Text="{Binding Sample}"
とやりましょう。
あとは xaml.cs で INotifyPropertyChanged
を実装してあげるなり好きにしましょう!
それでも俺は コードビハインド がしたい
はい。できます。 流石ですね。
そんな人には はい Shared project
(PCLと別の方法)。
やってみるのは簡単ですが、 Native View ができてからはもう少しスマートにコーディングできると思います。
Xamarin.Forms.Platform.Android.NativeViewWrapper
Xamarin.Forms.Platform.iOS.NativeViewWrapper
を使いキャストしてあげることで、ちょっとしたコーディングが簡単にできます。
私的には この ドキュメント をみて、やりたくなりました(時間がないのでできない。つらい。)。
まとめ
Platform Specifics
Native View
は 公式ドキュメントで サンプルコードが載っています。
ここでは、 Consuming Platform-Specifics
として Native View を使ったサンプルがあります。
他にも PlatformConfiguration
を使っていたりと改めて読んでみて参考になりました。
Consuming Platform-Specifics
はドキュメントからすると
実行した時にプラットフォームごとの違いを分ける としての立ち位置です。
(逆に、 Creating Platform-Specifics
は、
先にプラットフォームごとの違いを分けて作る かなと思います。)
Xamarin.Forms にとって プラットフォームごとに作るのはあまり望ましくないですが、
昔に比べて少しの違いなら、 Xamarin.Forms の機能だけで簡単にコーディングできるようになりました。
昔からやっている人はすぐに CustomRenderer
と言いますが、今では昔ほど頼ることはないと思います。
みなさんも是非 使ってみてください。