狠狠撸

狠狠撸Share a Scribd company logo
Prism for Windows Runtime
入門してみた
2013/7/6 めとべや東京(15:25-16:05)
@okazuki
大田 一希
自己紹介
? 大田一希
– Microsoft MVP for ClientAppDev 2011/07-2014/06
– 富士通アドバンストエンジニアリング
お仕事は「Java EE6」、Windows 8
– Twitter: @okazuki
– ブログ:かずきのBlog@hatena
http://d.hatena.ne.jp/okazuki
? 本書いてます
– Windows 8 ストア アプリ開発入門
– Windows ストア アプリ開発のレシピ110
犬紹介
? TwitterやBlogアイコンの犬はデール
– 15歳で死亡
– 雑種
? TwitterやFacebookで
よく言ってる犬はアンセム
– 9歳(現役)
– ミニチュアダックス
– 昨日持病の腰痛でダウン
お約束
? 掲載内容は私自身の見解であり、所属する組織を代表するもの
ではありません
今日のセッションの目標
? 新しいWindows ストア アプリを作るときに普通のテンプレー
トではなくPrism for Windows Runtimeを使おうかなと思っ
てもらう
Prism for Windows Runtimeとは
以降Prism for WinRT
Prism
? patterns & practices チームの作ってるXAML系 platform
の開発を行うためのライブラリ
– Prism 4.1
? WPF 4.0, Silverlight 5 and Windows Phone 7.1
– 複合型アプリケーションの作成を目的
– 画面にRegionと呼ばれる領域を定義して、そこに色んなところから画面を流し込む
– モジュール間の連携, DIコンテナとの連携, etc…
– 途中からMVVMパターンをサポート
– よくも悪くも複雑化…
– Prism for WinRT
? Windows ストア アプリのためのPrism
– シンプルにMVVM+現在のWindows Runtimeに足りない部分を補う
Prism for WinRT
? MVVMパターンのサポート
– ページ(View)とViewModelのマッピング機能
– ViewModelでのページのライフサイクルへ対応
– ICommandインターフェースの実装DelegateCommandを提供
? 非同期なメソッドからのDelegateCommandの作成とかしてくれる
? Windows Runtime固有の機能のサポート
– ページ遷移履歴の保存
– サスペンド時の状態保存
– フライアウト
? 一般的なアプリに必要な機能のサポート
– 入力値の検証
– 疎結合な連携のためのイベントの発行と購読(EventAggregator)
MVVMサポート
? VisualStateAwarePageクラス(View)
– Prism for WinRTの画面用基本クラス(LayoutAwarePageのようなもの)
? ViewModelクラス(ViewModel)
– ページ遷移のコールバックメソッド
– NavigationServiceを使うことでViewModelで画面遷移の処理が可能に
– サスペンド時に状態の一時保存と停止状態からの状態復元
? BindableBase(Model)
– INotifyPropertyChangedの実装
? ValidatableBindableBase(Model)
– プロパティの値の検証機能の実装
? ViewModelLocatorクラス(ViewとViewModelの接続)
– Viewのクラス名から自動的にViewModelを生成してDataContextに設定
WinRT固有の機能のサポート
? VisualStateAwarePage + NavigationService
– 画面遷移履歴
– ページ(とViewModel)の状態保存?復元
? フライアウト
– 何故標準にないのか不思議なフライアウトのサポート
? 設定チャームのコマンドのサポート
? 検索チャームのサポート
Prism for WinRTの起動処理
? MvvmAppBaseクラス
– INavigationServiceの初期化
? 画面遷移
– ISessionStateServiceの初期化
? セッションデータの保存
– IFlyoutServiceの初期化
? 何故か標準でサポートされてないフライアウト
– 利用者はOnLaunchApplicationメソッドをオーバーライドしてお膳立て
された状態で開発がスタートできる
Prism for WinRTとは まとめ
? MVVM + Windows ストア アプリ固有機能 + α =
Prism for WinRT
? MVVM
– ViewModel, DelegateCommand, ViewModelLocator
? ストアアプリ固有機能
– 画面遷移
– サスペンド時の処理への対応
– 何故か標準でサポートされてないフライアウト
? α
– 入力値の検証
– ゆるふわな相互通信(EventAggregator今回は時間の都合で…)
Prism for WinRTを使ってみよう
ちょっとめんどくさい…
? Appクラスの親クラスをMvvmAppBaseに変更
? Pageクラスの親クラスをVisualStateAwarePageに変更
? etc...
– 参考:Prism for WinRT入門 Hello world
テンプレート
? Prism for Windows Runtime Templates
http://visualstudiogallery.msdn.microsoft.com/e8664
9de-2b5e-45bb-bc65-5c6499b92b34
– 拡張機能と更新プログラムからPrismで検索でもOK
プロジェクトテンプレート
? プロジェクトテンプレート
– PrismApp
シンプルなPrismを使ったアプリを作るためのひな形
– PrismApp using Unity
ModelやViewModelのインスタンスの管理をUnity(ゲームじゃないほう)
で行うためのひな形
アイテムテンプレート(1/2)
? アイテムテンプレート
– Flyout View (Prism), Flyout View Model (Prism)
? フライアウト用のViewとViewModelのテンプレート
– Model (Prism)
? 値の検証を行う機能を持ったクラス
– Page View (Prism), View Model (Prism)
? ViewModelと接続されたページとViewModelのテンプレート
アイテムテンプレート(2/2)
? アイテムテンプレート
– PubSubEvent (Prism)
? EventAggregatorで発行/購読できるイベントを作る
– Search Contract (Prism)
? 検索結果のページ+MvvmAppBaseのOnSearchApplicationをオーバーライド
– UserControl View (Prism)
? 普通のユーザーコントロール。存在意義がわからない。
新規作成したアプリの基本構造
? 超シンプル
App.xaml
MvvmAppBase継承
エントリポイント: OnLaunchApplication
MainPage.xaml
VisualStateAwarePage継承
MainPageViewModel.cs
ViewModel継承
NavigationServiceで遷移
ViewModelLocatorで接続
画面遷移
? MvvmAppBaseクラスのNavigationServiceプロパティを使う
– MvvmAppBaseのOnLaunchApplicationメソッドがエントリポイント
– 文字列“Main” → Views名前空間の”Main”Pageクラスがページ
ViewとViewModelの接続
? ViewModelLocator.IsAutoWiredViewModel=“True”が肝
– MainPageクラス → ViewModels名前空間の“MainPage”ViewModelが
DataContextに設定される
規約のカスタマイズも可能
? 画面名のクラス名の規約
– MvvmAppBaseクラスのType GetPageType(string pageToken)を
オーバーライド
? ViewModelのクラス名の規約
– ViewModelLocatorのSetDefaultViewTypeToViewModelResolver(
Func<Type, Type> viewTypeToViewModelTypeResolver)で設定
? 規約ではなく個別設定も可能
– デフォルトのコンストラクタ以外でViewModelをインスタンス化したい場
合はこれがお手軽
– ViewModelLocator.Register(
typeof(MainPage).ToString(),
() => new MainViewModel(NavigationService));
あとは育てていく
? Views名前空間にページを増やす
? ViewModels名前空間に対応するViewModelを増やす
? 惭辞诲别濒蝉名前空间にアプリケーションの肝を作りこむ
まとめ
? テンプレートを使おう
? MvvmAppBaseのOnLaunchApplicationがエントリポイント
? MvvmAppBaseのNavigationServiceで画面遷移
? 規約を覚えよう
– Main -> Views.MainPage
– MainPage -> ViewModels.MainPageViewModel
– カスタマイズもできることを覚えておこう
? あとは育てる!
How to ...
色々やりたいこと別に
画面遷移したいんです
? MvvmAppBaseクラスのNavigationServiceプロパティを使おう
– ViewModelのインスタンス化の時に渡すのが綺麗
– ViewModelから遷移処理を書く
HubPageへ遷移
画面遷移時の処理がしたいんです
? ViewModelのOnNavigateFrom/Toをオーバーライド
サスペンド時の対応がしたいです その1
? ViewModelのプロパティにRestoreableStateAttributeを
つけましょう
サスペンド時の対応がしたいです その2
? ページの状態の保持はSaveStateメソッド、復元には
LoadStateメソッドを使いましょう
? ViewModelは、その1の属性による方法かNavigateTo,
NavigateFromで行いましょう。
– 参考:Prism for WinRTでGridViewのスクロール位置を記録する
入力値の検証がしたいです
? ValidatableBindableBaseを継承したModelを作りましょう
– プロパティにSystem.ComponentModel.DataAnnotationsをつける
– 参考:Prism for WinRTのValidatableBindableBase
フライアウトを出したいです
? FlyoutViewを作りましょう
必要に応じてFlyoutViewModelを作って接続しましょう
– 閉じる処理や、設定チャームに戻る処理などはViewModelに用意されます
– フライアウトの表示はMvvmAppBaseクラスのFlyoutServiceクラスの
ShowFlyout(string flyoutId)で行います
– 参考:Prism for WinRTでフライアウトを出したい
ViewModelの生成を楽したいです(1/2)
? 一定数の規模を超えてくるとViewとViewModelの紐づけが大変
– ViewModelLocator.Register(View名, () => ViewModel生成処理);
– デフォルトコンストラクタでよければ、↑はいらないけどそんな単純に物
事はすすまない
? UnityContainerなどのDIコンテナに処理を任せましょう
– Prism app using Unityをもとにアプリを作る
ViewModelの生成を楽したいです(2/2)
? Appクラスの中身が以下のようになる
View/ViewModelが増えてもAppクラスが
肥大化しない。
まとめ
Prism for Windows Runtime
? MVVM + WinRT + α
– ViewModel, VisualStateAwarePage, DelegateCommand, Flyout,
etc...
? プロジェクトテンプレート/アイテムテンプレートを使おう
– Prism for Windows Runtime Templates
http://visualstudiogallery.msdn.microsoft.com/e86649de-2b5e-
45bb-bc65-5c6499b92b34
? 標準のテンプレートよりはいけてる
– Enterprise向けだけじゃなく、一般向けでも使いやすい。
今回はなしてない機能もあります
? EventAggregator
– 祖結合なイベントでのやり取り
? SearchPane
– 検索コントラクトの表示とか
? 設定コントラクト
– 設定コントラクトにコマンドを簡単に置けます
? 認証情報の保存
– 安全な場所へのパスワードなどのばれたらいけない情報を保存できます
おまけ
? Windows 8.1 Previewでは…
– 検索コントラクトの動きちげー
– 画面のスナップ?フィル?ポートレイト?ランドスケープがなくなった
(幅と高さとかから自分で最適な見た目を制御するっぽい)
– そもそもプロジェクトテンプレートの中身がちげー
– APIめっちゃ増えとる
? キャッチアップしてBlogりたいのでよろしくお願いします
参考情報
? patterns & practices: Prism for the Windows Runtime
– http://prismwindowsruntime.codeplex.com/
? Developing a Windows Store business app using C#,
XAML, and Prism for the Windows Runtime
– http://msdn.microsoft.com/en-
us/library/windows/apps/xx130643.aspx

More Related Content

Prism for windows runtime入門