SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C++/CXでHelloUWP!

C++/CXでHelloUWP!(後編)

step-4: ページ移動に付随させるパラメータ

 UWPアプリのUIは紙芝居方式なものですから、ページが切り替わると前のページは見えなくなります。元ページのデータが見えなくなると困るシチュエーションでは、元ページから移動先ページへデータ(パラメータ)を引き渡すことができます。やってみましょう。

 MainPage.xamlに置いたButtonのすぐ上に入力フィールドとしてTextBoxを配置し、名前をMessageとしましょう。Page2への移動時にここに入力された文字列をPage2に引き渡します。

 MainPageのButtonクリックに反応するイベントハンドラ内で呼び出すNavigateTo()の第2引数に、Messageに入力された文字列を与えておけば、これを移動先まで連れてってくれます。

 MainPageから連れてきた文字列をPopupダイアログに書いてみます。

 追加したOnNavigatedTo()内でPopupダイアログを表示するわけですが、UWPではPopupダイアログの[閉じる]ボタンが押されるまで「ベタ待ち」することができません。ユーザーからの入力待ちやファイルのオープン/読み書きなどなど、完了までに時間のかかりそうな処理は非同期に行われます。末尾に~AsyncのついたAPIはすべて非同期です。非同期処理はその完了を待つことなくすぐさま呼び出し元に返ってきます。非同期メソッドの処理はUIをつかさどるスレッドとは異なる別のスレッドで行われます。非同期処理が終わってからでないと始められない後続処理は、非同期処理の開始時に「終わり次第引き続いてやること」として登録しておくことになります。

 C#だとasync~awaitを用いて簡単に書けるのですが、C++/CXでは<ppltasks.h>を#includeしたうえでcreate_task()~then()とlambda式を用いた少々ややこしい実装です。

 concurrency::create_task(~) によって、その引数に与えられた処理を別スレッド内のタスクとして実行します。message_task.then(~)に与えられた処理(lambda式)はタスク終了時に行う処理です。

 ぱっと見、何やってんだか分かりづらいのですけれど、UWPでは非同期処理がいたるところで使われるので慣れてもらうしかありませんです。C++でもC#のasync~awaitみたいに書けるよう、言語仕様/ライブラリを拡張する提案がなされているらしいのですが……。

次のページ
step-5:「戻る」の実装

この記事は参考になりましたか?

C++/CXでHelloUWP!連載記事一覧
この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9133 2016/01/08 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー