読者です 読者をやめる 読者になる 読者になる

nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

【メモ】INavigationがPlatformによって実装が異なる話

あくまでメモでなのでご注意を

  • 網羅的な説明になっていません
  • 内容の正誤を十分検証していません

つぎのようなコードを呼ぶとき

page.Navigation.PushAsync(new NewPage());

NavigationプロパティはINavigationインターフェースの実装クラスで、その実態はNavigationProxyクラスです。
NavigationProxyはあくまでProxyクラスで、実体?はInnerプロパティに設定されています。

Xamarin.Forms/NavigationProxy.cs at b9b9d2536ff0cd6ae4526356d663706c721e481f · xamarin/Xamarin.Forms · GitHub

画面遷移するたびにProxyは作られて、Innnerは遷移前から遷移後へ受け渡されていきます。

実体は大きく二つあって、Modal遷移の場合はApplicationクラスの内部クラスのNavigationImplクラスが

Xamarin.Forms/Application.cs at e6d5186c8acbf37b877c7ca3c77a378352a3743d · xamarin/Xamarin.Forms · GitHub

Hierarchical遷移(つまりNavigationPage)の場合はNavigationPageの内部クラスのNavigationImplクラスが使われます。

Xamarin.Forms/NavigationPage.cs at 070f1dcdb50b47c7abdebf91010626d55881a8fc · xamarin/Xamarin.Forms · GitHub

でまぁ、これで終わりじゃないのがめんどうくさくって、ApplicationクラスのMainPageプロパティの設定時にNavigationImpleのさらにInnnerへ各プラットフォーム別の実装が設定されます。
Androidの場合はここ

Xamarin.Forms/Platform.cs at e6d5186c8acbf37b877c7ca3c77a378352a3743d · xamarin/Xamarin.Forms · GitHub

各PlatformクラスがINavigationを実装しているんですね。

つまりINavigationの振る舞いは、当然と言えばそれまでですがプラットフォームによって異なります。
動作もちょっと違います。
私が知っている範囲だと、Modal遷移した時のNavigationStackの要素数が0だったり1だったりプラットフォームによって違う気がしています。

この辺りちゃんと調べて、必要であれば貢献したいですね。
以上です。

【Xamarin.Forms】DisplayAlertを表示するBehavior

みなさんWPF用のMVVMインフラストラクチャであるLivetをご存知ですか?

ふとしたきっかけで、Livetの機能を見ていて
「指定されたEventでダイアログを表示し、その後ViewModelをよびだす」
機能が、Xamarin.Formsでも使えると便利だなと思いました。
そこで指定EventでDisplayAlertを表示しAcceptボタンが押されたときにCommandを事項するBehaviorを作成してみました。

続きを読む

Blue Monkey Architecture Overviewに対する訂正

先日公開した、つぎの記事について何点か指摘をいただきました。

【Xamarin】Blue Monkeyプロジェクト Architecture Overview コメント入り掲載 - nuits.jp blog

指摘の通り、前述の記事には明らかに誤った記載が何点かありました。読んでいただいた方には大変申し訳ないことをしました。
つぎの点について本稿にまとめます(リンク先の記事も追って修正します)。

  1. 誤りのある部分の訂正*1
  2. 現時点で、正しく理解できていない箇所に対する言及

今回指摘いただいたことで、深く考えずに思い込んでいた点に気がつくことができました。指摘いただいた方、指摘に対する理解を助けていただいた方々には感謝の念がたえません。ありがとうございました。

*1:これも私の理解が適切ではない可能性があります。訂正にあたって参考にさせていただいた資料も併せてご覧ください

続きを読む

Prism 6.3.0がリリースされました

去年末からリリースの待たれていたPrism 6.3.0が先ほどリリースされました。

https://github.com/PrismLibrary/Prism/wiki/Release-Notes-6.3.0

今回のリリースはXamarinから見ると非常に多くの魅力的な機能追加が含まれています。

  • 画面遷移時に、遷移前処理を実装することのできるOnNavigatingToの追加
  • ナビゲーションスタックから画面が削除される時(つまり遷移が戻る時)にリソースの解放などを実装できるIDestructibleの追加
    (ReactivePropertyなどのイベント購読解除などが非常に簡単確実に)
  • EventToCommand実装の追加
  • INavigationAwareでBackButton押下時のイベントハンドリング
    (NavigationBarが対応できているか未確認。多分無理なのではないかなあ)
  • ApplicationのSleep・Resumeイベントハンドリング

などなどです。
ただ、良いことばかりではなく、破壊的変更がいくつか含まれているので注意も必要です。

  • 厳密な署名のキーが変更されているため、既存のPrism拡張ライブラリを作っていたような人はリビルドが必要
  • DelegateCommandの一部機能が仕様変更(Async関連など)
  • INavigationAwareにOnNavigatingToの追加(該当インターフェースを実装しているクラスでOnNavigatingToを追加する必要があり)

など、他にもいくつか重要な変更がありますので近いうちにまとめたいと思います。

なんにせよ、個人的には待ちに待ったリリースです。
魅力的な機能が含まれるのもですが、私自身が貢献できた機能もあり非常に嬉しいです。

ということで、近日詳細は紹介したいと思います。しばしお待ちを!

技術書典2 & 超技術書典でXamarin本出します

すでにご存じの方もいらっしゃると思いますが、つぎの技術同人誌イベントにてXamarin本を出典します!

techbookfest.org

techbookfest.org

(Xamarin.Mac)初心者向けの記事からディープな記事まで、一部メンバーが入れ込み過ぎて、えのさんも呆れるほど書きまくった結果、2冊分冊になってしまいました。
全部ディープなんじゃないのと疑いを持った方!非常に丁寧な、本当に初心者向けな記事ですよ!

私は、例によってPrismの記事を書いているんですが、入門より一歩踏み込んだ使いこなし術的なのを書かせていただきました。(まだレビュー終わってないですけどw
例えばこんな謎技術だったりとかです。

f:id:nuitsjp:20170319214406p:plain

ReSharperやRiderではViewModelのメンバのIntelliSenseが有効になるのですが、Prismを利用するとこれが無効になってしまいます。
Prismの機能を一切制限することなく、「PrismもしくはRiderで」ViewModelのメンバのIntelliSenseを有効にするトリックです。
他にも知っていると便利になるPrism使いこなし術を紹介してます。

まずは4/9 う-13「Xamaritans」でお待ちしています!
ぜひ皆さんのお越しをお待ちしています。