65

20140322 mvvm crossforwindowsstoreapps-pdf

  • Upload
    -

  • View
    1.012

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 2: 20140322 mvvm crossforwindowsstoreapps-pdf

仕事

個人

http://tanaka733.net

http://tech.tanaka733.net

http://www.buildinsider.net/web/iis8

Page 3: 20140322 mvvm crossforwindowsstoreapps-pdf

http://metrostyledev.net/

テーマ

次回

Page 4: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 5: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 6: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 7: 20140322 mvvm crossforwindowsstoreapps-pdf

XAML はBindingファーストな言語

XAMLといえば MVVM patternGUIアーキテクチャパターンの基礎からMVVMパターンへ

Page 8: 20140322 mvvm crossforwindowsstoreapps-pdf

View ViewModel Model

参考資料 GUIアーキテクチャパターンの基礎からMVVMパターンへ 40pより引用

Page 9: 20140322 mvvm crossforwindowsstoreapps-pdf

状態変更イベントの発火

コマンドの記述

Page 10: 20140322 mvvm crossforwindowsstoreapps-pdf

Simpleな単機能アプリなら…

込み入ったアプリを作ると…

Page 11: 20140322 mvvm crossforwindowsstoreapps-pdf

ViewModelの変更プロパティ、コマンド

ViewModelとModelの架け橋

Page 12: 20140322 mvvm crossforwindowsstoreapps-pdf

MVVM Light Toolkit

Pattern & Practices Prism

MvvmCross

Page 13: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 14: 20140322 mvvm crossforwindowsstoreapps-pdf

iOS/Obj-C

Android Java

Windows Store/Phone C# etc

Page 15: 20140322 mvvm crossforwindowsstoreapps-pdf

https://xamarin.com/

Page 16: 20140322 mvvm crossforwindowsstoreapps-pdf

Xamarinもネイティブをたたくだけ

コードをどこまで共有化できるか

Page 17: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 18: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 19: 20140322 mvvm crossforwindowsstoreapps-pdf

Portability

できるだけコードは共通化したい

Interface Driven Development

IoCによる依存性注入

MVVM

Native UI

プラットフォームネイティブのUIを使おう

https://github.com/MvvmCross/MvvmCross/wiki/The-MvvmCross-Manifesto

Page 20: 20140322 mvvm crossforwindowsstoreapps-pdf

PCL(Win Store)

View

(Android)

View

(iOS)

View

ViewModel Model

Page 21: 20140322 mvvm crossforwindowsstoreapps-pdf

QuickCross

ReactiveUI

Page 22: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 23: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 24: 20140322 mvvm crossforwindowsstoreapps-pdf

プロジェクトを作って起動するまで

実際の開発で使っている機能の紹介画面遷移の仕組み

SQLiteなどプラグインの追加

プラットフォーム固有の機能の追加

Page 25: 20140322 mvvm crossforwindowsstoreapps-pdf

Store Appのみの場合

Androidアプリも開発する場合Xamarinが必要。VSで開発する場合はBusinessEdition以上でVS拡張をインストール。

iOSアプリも開発する場合Xamarinに加えてデザイナ、ビルドにMac OS が必要

Page 26: 20140322 mvvm crossforwindowsstoreapps-pdf

PCLとストアプロジェクトを作成

Page 27: 20140322 mvvm crossforwindowsstoreapps-pdf

NugetでMvvmCrossを検索

Page 28: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 29: 20140322 mvvm crossforwindowsstoreapps-pdf

Appクラス

ViewModel

IoCによるServiceクラスの注入

Page 30: 20140322 mvvm crossforwindowsstoreapps-pdf

using Cirrious.CrossCore.IoC;using Cirrious.MvvmCross.ViewModels;using RoomMetro.RegisterationService.Core.ViewModels;

namespace RoomMetro.RegisterationService.Core{

public class App : MvxApplication{

public override void Initialize(){

CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();

RegisterAppStart<MemberListViewModel>();}

}}

Page 31: 20140322 mvvm crossforwindowsstoreapps-pdf

using Cirrious.CrossCore.IoC;using Cirrious.MvvmCross.ViewModels;using RoomMetro.RegisterationService.Core.ViewModels;

namespace RoomMetro.RegisterationService.Core{

public class App : MvxApplication{

public override void Initialize(){

CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();

RegisterAppStart<MemberListViewModel>();}

}}

Page 32: 20140322 mvvm crossforwindowsstoreapps-pdf

using Cirrious.CrossCore.IoC;using Cirrious.MvvmCross.ViewModels;using RoomMetro.RegisterationService.Core.ViewModels;

namespace RoomMetro.RegisterationService.Core{

public class App : MvxApplication{

public override void Initialize(){

CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();

RegisterAppStart<MemberListViewModel>();}

}}

Page 33: 20140322 mvvm crossforwindowsstoreapps-pdf

public class MemberListViewModel: MvxViewModel{

private readonly IDataService dataService;

public MemberListViewModel(IDataService dataService){

this.dataService = dataService;}

private ObservableCollection<MemberViewModel> members = new ObservableCollection<MemberViewModel>();public ObservableCollection<MemberViewModel> Members{

get{

return members;}

set{

if (members == value){

return;}members = value;RaisePropertyChanged(() => Members);

}} //続く

Page 34: 20140322 mvvm crossforwindowsstoreapps-pdf

private MvxCommand loadCommand;

public MvxCommand LoadCommand{

get{

return loadCommand?? (loadCommand = new MvxCommand(ExecuteLoadCommand));

}}

private void ExecuteLoadCommand(){

LoadAsync().FireAndForget();}

}

Page 35: 20140322 mvvm crossforwindowsstoreapps-pdf

https://gist.github.com/tanaka-takayoshi/8221618#file-mvxprop-snippet-xml

https://gist.github.com/tanaka-takayoshi/8505439#file-mvxcommand-snippet-xml

Page 36: 20140322 mvvm crossforwindowsstoreapps-pdf

public MemberListViewModel(IDataService dataService){

this.dataService = dataService;}

public override void Initialize(){

CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();

RegisterAppStart<MemberListViewModel>();}

Page 37: 20140322 mvvm crossforwindowsstoreapps-pdf

Setupクラス

App.xaml.csの修正

Viewの定義

Page 38: 20140322 mvvm crossforwindowsstoreapps-pdf

namespace RoomMetro.RegisterService.Store{

public class Setup : MvxStoreSetup{

public Setup(Frame rootFrame) : base(rootFrame) {}

protected override IMvxApplication CreateApp(){

return new RegisterationService.Core.App();}

protected override IMvxTrace CreateDebugTrace(){

return new DebugTrace();}

}}

Page 39: 20140322 mvvm crossforwindowsstoreapps-pdf

//前略

if (rootFrame.Content == null){

var setup = new Setup(rootFrame);setup.Initialize();

var start = Mvx.Resolve<IMvxAppStart>();start.Start();

}

//後略

Page 40: 20140322 mvvm crossforwindowsstoreapps-pdf

最低限CreateAppメソッド

それ以外は命名規約やフォルダ配置規約

https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup

Page 41: 20140322 mvvm crossforwindowsstoreapps-pdf

通常のStore App

MvvmCrossでは…

Page 42: 20140322 mvvm crossforwindowsstoreapps-pdf

単純には…

パラメーターを渡すときは…

遷移先のViewModelでは次のようにして受け取る

ShowViewModel<MemberViewModel>();

ShowViewModel<MemberDetialViewModel>(new MemberDetailParameters {Id = 1});

public class MemberDetialViewModel : MvxViewModel{

public void Init(MemberDetailParameters param){

var id = param.Id;//idを使って詳細情報を取ってくるなど

}}

https://github.com/MvvmCross/MvvmCross/wiki/ViewMo

del--to-ViewModel-navigation

Page 43: 20140322 mvvm crossforwindowsstoreapps-pdf

SQLiteがおすすめ

https://connect.microsoft.com/SQLServer/feedback/details/776328/port-sql-compact-to-windows-rt

Page 44: 20140322 mvvm crossforwindowsstoreapps-pdf

http://visualstudiogallery.msdn.microsoft.com/1d04f82f-2fe9-4727-a2f9-a2db127ddc9a

Page 45: 20140322 mvvm crossforwindowsstoreapps-pdf

Nugetから入れる

Page 46: 20140322 mvvm crossforwindowsstoreapps-pdf

public class DataService : IDataService{

private readonly ISQLiteConnection connection;

public DataService(ISQLiteConnectionFactory factory){

connection = factory.Create("roommetro.sql");connection.CreateTable<Member>();

}

public Member Get(int id){

return connection.Get<Member>(id);}public void Insert(Member member){

connection.Insert(member);} //以下略

Page 47: 20140322 mvvm crossforwindowsstoreapps-pdf

たとえば、ViewModelでVisibilityを制御したい

Page 48: 20140322 mvvm crossforwindowsstoreapps-pdf

たとえば、ViewModelでVisibilityを制御したい

Converterを使おう

Page 49: 20140322 mvvm crossforwindowsstoreapps-pdf

MvxVisibilityというのがPluginで提供されている

Page 50: 20140322 mvvm crossforwindowsstoreapps-pdf

MvxVisibilityというのがPluginで提供されている

が、自分でひと手間かける必要あり

Page 51: 20140322 mvvm crossforwindowsstoreapps-pdf

private MvxVisibility attendedVisibility = MvxVisibility.Visible;public MvxVisibility AttendedVisibility{

get{

return attendedVisibility;}

set{

if (attendedVisibility == value){

return;}attendedVisibility = value;RaisePropertyChanged(() => AttendedVisibility);

}}

Page 52: 20140322 mvvm crossforwindowsstoreapps-pdf

Store側にNativeConvertersを作る

namespace RoomMetro.RegisterService.Store.NativeConverters{

public class VisibilityConverter :MvxNativeValueConverter<MvxVisibilityValueConverter>

{}

public class ColorConverter : MvxNativeValueConverter<MvxNativeColorValueConverter>{}

}

Page 53: 20140322 mvvm crossforwindowsstoreapps-pdf

<Applicationxmlns:nativeConverters="using:RoomMetro.RegisterService.Store.NativeConverters"><Application.Resources>

<x:String x:Key="AppName">めとべや参加登録アプリ カッコカリ</x:String><nativeConverters:VisibilityConverter x:Key="Visibility" /><nativeConverters:ColorConverter x:Key="NativeColor" />

</Application.Resources></Application>

<TextBlock Text="{Binding Name}"Foreground="{Binding AttendedStatusColor, Converter={StaticResource NativeColor}}"Visibility="{Binding AttendedVisibility, Converter={StaticResource Visibility}}" />

Page 54: 20140322 mvvm crossforwindowsstoreapps-pdf

まずは豊富なPluginをチェック

すでに誰かが用意してくれているかもしれない

Modelに書きたい

IoCを使って分離しよう or Plugin を作ろう

Page 55: 20140322 mvvm crossforwindowsstoreapps-pdf

Core (PCL)(Win Store)

View

(Android)

View

(iOS)

View

ViewModel Model

Page 56: 20140322 mvvm crossforwindowsstoreapps-pdf

Core (PCL)(Win Store)

View

(Android)

View

(iOS)

View

ViewModel Model

IPiyo

(Win Store)

StorePiyo

(Android)

DroidPiyo

(iOS)

TouchPiyo

Page 57: 20140322 mvvm crossforwindowsstoreapps-pdf

Plugin

Core (PCL)(Win Store)

View

(Android)

View

(iOS)

View

ViewModel Model

IPiyo

(Win Store)

StorePiyo

(Android)

DroidPiyo

(iOS)

TouchPiyo

Page 58: 20140322 mvvm crossforwindowsstoreapps-pdf

namespace RoomMetro.RegisterationService.Core{

public interface INotification{

void Notify(string message);}

}

Page 59: 20140322 mvvm crossforwindowsstoreapps-pdf

public class StoreNotification : INotification{

public void Notify(string message){

//タイル通知のコード省略}

}

public class Setup : MvxStoreSetup{

//これ以外のメソッド省略protected override void InitializeLastChance(){

base.InitializeLastChance();Mvx.RegisterSingleton<INotification>(new StoreNotification());

}}

Page 60: 20140322 mvvm crossforwindowsstoreapps-pdf

MvvmCrossはストアアプリ単体を作る視点においても高機能

今回の内容は割とまだ基本的な機能レベル

Page 61: 20140322 mvvm crossforwindowsstoreapps-pdf

https://github.com/MvvmCross/MvvmCross

https://github.com/MvvmCross/MvvmCross/wiki

https://github.com/MvvmCross/NPlus1DaysOfMvvmCross

Page 62: 20140322 mvvm crossforwindowsstoreapps-pdf

http://ytabuchi.hatenablog.com/

実際にMvvmCrossでアプリを開発した経験に基づく記事があります

(Xamarin Studioを使ったiPhone/Androidアプリ)

http://iseebi.hatenablog.com/

Page 63: 20140322 mvvm crossforwindowsstoreapps-pdf

https://www.slideboom.com/presentations/591514/GUI%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3

Page 64: 20140322 mvvm crossforwindowsstoreapps-pdf
Page 65: 20140322 mvvm crossforwindowsstoreapps-pdf