[Xamarin.Forms] 新機能! NativeのUIが xaml で使える!?

  • 18
    Like
  • 0
    Comment

はじめに

11月の下旬に Xamarin.Forms 2.3.3 がリリースされました。:tada:
内容は予定通り 新機能の 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 におまじないを書くだけです。公式の説明では画像のとおりです

スクリーンショットXamlサンプル.png

ポイントとして
なぜ、各プラットフォームごとでコンパイルされるかというと
各宣言の末にある targetPlatform= でパッケージごとに分けてあげています。

この targetPlatform を見てくれてるわけです。
そして実際に宣言するときは

スクリーンショットXamlサンプル2.png

と宣言してあげれば、あとは自由に使えます。簡単ですね。

※ 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 と言いますが、今では昔ほど頼ることはないと思います。

みなさんも是非 使ってみてください。

This post is the No.4 article of Xamarin(その2) Advent Calendar 2016