Prism.Formsついて
2016/5/7 JXUGC #13 東京 緊急開催 Xamarin のすべて!
大田 一希
自己紹介
• 名前/SNS
• 大田 一希(かずき)
• Twitter: @okazuki
• Blog
• かずきのBlog@hatena
http://blog.okazuki.jp/
• その他
• Microsoft MVP for Windows Development
• ReactiveProperty
https://github.com/runceel/ReactiveProperty
• Xamarin初心者です
• Love UWP and WPF
お約束事項
• 記載の内容は個人の見解であり、所属する企業を代表するものではあり
ません。
今日のゴール
• 近い未来にXamarin.Formsで開発するときにPrismを候補に上げてもらえ
れば万歳
日本時間5/6にアップデートがありました(つらい)
Prismとは
Prismとは
• Microsoft Pattern & Practicesチームで開発さ
れたComposite Application Library for WPF
というライブラリ
• 現在はMicrosoft MVPが中心となったチームに
移管されて開発継続中
• WPF, Silverlight, Windows store app, UWPな
どXAMLファミリーに対応してきた
• Xamarin.FormsにもPrism.Formsという名前で
対応中
(現在Preview版がリリースされている)
Prism.Formsの特徴
• MVVMパターンをサポート
• ViewModelでの画面遷移イベントの補足(NavigatedTo, NavigatedFrom)
• ViewModelでの画面遷移、ダイアログ表示(INavigationService、
IPageDialogService)
• ViewとViewModelの自動紐づけ(命名規約[カスタマイズ可能]による紐づけ)
• INotifyPropertyChangedの実装クラスの提供
• ICommandの実装クラスの提供
• DIコンテナ(Unity)と連携
• Modelクラスインスタンス管理とかクラスの組み立てとかめんどくさいことは丸投げ出来る
• DependencyServiceからのインスタンスの取得のサポート
• 以下のプラットフォームをサポート
• Android, iOS, Windows sotre app, Windows Phone, UWP
(要はXamarin.Formsが動けば動く)
Hello world
険しい道のり
• Xamarin.Formsのライブラリの依存関係(Andorid)が割とすぐ壊れる
• NuGetから再インストールで解決できるけど心臓に悪い
Hello world
• AndroidのプロジェクトからXamarin.FormsとSupport関連のライブラリを
消しておく
• Prism.Unity.FormsをNuGetから追加
Hello world
• Appクラスの基本クラスをPrismApplicationに変更
• 抽象メソッドをオーバーライド
• Views名前空間にMainPage.xamlを作成
• App#RegisterTypesでPageを登録
• App#OnInitializedで画面遷移
Hello world(ViewModel追加)
• ViewModels名前空間にMainPageViewModelを追加
• 以下の記述をMainPage.xamlに追加
• xmlns:Prism=“clr-namespace:Prism.Mvvm;assembly=Prism.Forms”
Prism:ViewModelLocator.AutowireViewModel=“True”
• 適当にMainPageViewModelのプロパティを作ってViewとBinding
ちょっとめんどくさいよね
• 安心してください。プロジェクトテンプレートがあります。
• 拡張機能でPrismで検索
プロジェクトテンプレート
• Prism/Formsというカテゴリに以下のものが追加されます
• Prism Unity App (Forms)
• Hello world相当の内容が設定済み。
• 2016/5/7現在、1バージョン古いPrism.Formsを参照しているのでNuGetの
更新が必要
Demo
機能紹介
MVVM関連
• ViewModelの基本クラスの提供
• BindableBaseクラス
以下のように書くと変更通知プロパティが定義可能
MVVM関連
• ICommandの実装クラスの提供
• DelegateCommandクラス
ExecuteとCanExecuteをデリゲートで渡して定義する
• ObservsPropertyでCanExecuteの発火タイミングのプロパティを指定可能
MVVM関連
• ViewModelでの画面遷移
• ページは、AppクラスのRegisterTypesメソッドで登録する
• RegisterTypeForNavigation<TPage>()メソッドを使用
MVVM関連
• ViewModelでの画面遷移
• INavigationServiceをViewModelで受け取り使用可能
• コンストラクタでINavigationService navigationServiceという引数を定義すること
でUnityからインジェクションされる
MVVM関連
• ViewModelでの画面遷移
• NavigationService#NavigateAsync(string pageName)で画面遷移可能
• “MainPage”でMainPageに画面遷移
• “HogehogePage/FogafugaPage”のようにすることでページを入れ子にすることが
可能
• 例:NavigationPage内で画面遷移させる等が可能
MVVM関連
• ナビゲーションのイベント捕捉
• INavigationAwareインターフェースの提供
ViewModelに実装するとNavigatedTo, NavigatedFromが画面遷移時に呼ばれ
るようになる
MVVM関連
• ViewとViewModelの紐づけ
• ViewModelLocator.AutowireViewModel=“True”で紐づけの有効化
• 命名規約(カスタマイズは可能)
Views/HogePage -> ViewModels/HogePageViewModel
MVVM関連
• ViewModelでダイアログを出すことも可能
• IPageDialogServiceインターフェースをコンストラクタで受け取ることで使用可能
• DisplayAlert, DisplayActionSheetメソッドでダイアログが表示可能
DIコンテナ
• UnityというDIコンテナと連携可能
• インスタンスのライフサイクルの管理と組み立てを任せることができる
• DependencyServiceからのインスタンス取得の自動化
• DependencyService.Get<T>()で取得できるインスタンスを自動でインジェクションしてくれる
Demo
画面遷移してみよう
まとめ
まとめ
• PrismはMVVMを支援するライブラリ
• View/ViewModelの紐づけ
• 画面遷移系
• ダイアログ
• MVVMでよく使う基本クラス
• DIコンテナもついてくる
• プロジェクトテンプレートをつかおう
まとめ
• まだまだPreviewですが、基本機能のそろったライブラリになりそうです。
あたたかい目で見守ってやってください。

Prism.Formsについて