SHOEISHA iD

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

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

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

UWPアプリ開発の最前線

UWPアプリを作るとき、画面遷移やアーキテクチャで悩んだら!?
~Windows Template Studioを使ってみよう

UWPアプリ開発の最前線 第11回

後から画面や機能を追加する

 Windows Template Studioのプロジェクトを作った後で、Windows Template Studioの画面や機能を追加することもできます。ソリューションエクスプローラーでプロジェクトの右クリックメニューを見ると[Windows Template Studio]というメニューが増えていて、そこから画面や機能を追加できます。

画面を追加する

 ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから[Windows Template Studio]-[新しいページ]を選ぶと、次の画像のようなダイアログが出てきます。

ページ追加ウィザード(その1)
ページ追加ウィザード(その1)

 追加するページを選び、右上のテキストボックスでページの名前を設定します。ここではChartページを追加してみましょう。[次へ]ボタンで、変更一覧画面に進みます(次の画像)。

ページ追加ウィザード(その2)
ページ追加ウィザード(その2)

 この画面は、これから加える変更点の一覧です。重要なのは「修正したファイル」(原文は"Modified files"=「変更後のファイル」)の内容です。上の画像に見えるように、修正されるファイルの差分が表示されるので、既存のコードが破壊されないことを確認してください。問題なければ[作成]ボタンをクリックして変更を適用します。問題がありそうなら、左下の[変更をマージしない (一時フォルダーに作成)。]にチェックを付けてから[作成]ボタンをクリックし、後から手動で変更してください。

 新しいページの追加に成功すると、次の画像のように変更一覧が表示されます。このGenerationSummary.mdファイルは一時フォルダーに作成されているので、必要なら名前を付けて別のフォルダーに保存してください(画像は別名で保存した後)。

ページ追加ウィザードの処理結果
ページ追加ウィザードの処理結果

 実行してみると、次の画像のようなChartページが追加されています。

追加されたChartページ
追加されたChartページ

機能を追加する

 機能を追加する方法も、同様です。ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから[Windows Template Studio]-[新しい機能]を選ぶと、次の画像のようなダイアログが出てきます。

機能追加ウィザード(その1)
機能追加ウィザード(その1)

 追加する機能を選びます。ここではSuspend and Resume機能を追加してみましょう。[次へ]ボタンで、変更一覧画面に進みます(次の画像)。

機能追加ウィザード(その2)
機能追加ウィザード(その2)

 この画面で修正されるファイルの差分を確認するのも、画面の追加と同じです。問題なければ[作成]ボタンをクリックして変更を適用します。

 新しい機能の追加に成功すると、次の画像のように変更一覧が表示されます。このGenerationSummary.mdファイルも、やはり一時フォルダーに作成されています。

機能追加ウィザードの処理結果
機能追加ウィザードの処理結果

追加したSuspend and Resume機能の利用例

 UWPアプリは、デスクトップでアイコン化されると(タブレットでは画面に表示されなくなると)、サスペンドされます。サスペンド状態ではCPUクロックがまったく割り当てられず、しかも、サスペンド状態から終了させられることもあります(この終了は、アプリには検知できません)。ということは、何か自動的にデータを保存する必要があるなら、サスペンド状態に入るときに保存しないといけません。

 ここでは、Mainページのテキストボックスの文字列を自動的に保存し、次にMainページが表示されるときにはその文字列を復元してみましょう。データの保存先には、プロジェクト作成時に自動的に追加されていたSettings Storage機能を利用することにします。

 Mainページのテキストボックスの文字列を保存するタイミングは、次の2つがあります(1文字入力されるごとに保存するのも不可能ではありませんが、やり過ぎというものでしょう)。

  • 他のページへ移動するとき:OnNavigatedFromメソッド(UWPに元々備わっている機能)
  • サスペンドに入るとき:OnBackgroundEnteringイベント(Suspend and Resumeの機能)

 この2つのタイミングで、テキストボックスのデータを保存するコードは次のようになります。

テキストボックスの内容を自動で保存/復元する(MainPage.xaml.cs
// bw: LocalSettingsに保存するデータのキー
const string SettingsKey = "MainPage_ToastMessage";

// bw: ページが表示されるときに呼び出されるメソッド
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    // サスペンドに入るときのイベントハンドラーをセット(Suspend and Resume機能)
    Singleton<SuspendAndResumeService>.Instance.OnBackgroundEntering
        += OnBackgroundEntering;

    // ページ表示時にテキストボックスの内容を復元(Settings Storage機能)
    if (await ApplicationData.Current.LocalSettings.ReadAsync<string>(SettingsKey)
            is string msg)
        this.TextBox1.Text = msg;
}

// bw: 他のページへ移動するときに呼び出されるメソッド
protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);

    // サスペンドに入るときのイベントハンドラーを解除(Suspend and Resume機能)
    Singleton<SuspendAndResumeService>.Instance.OnBackgroundEntering
        -= OnBackgroundEntering;

    // ページから離れる時にテキストボックスの内容を保存(Settings Storage機能)
    await ApplicationData.Current.LocalSettings.SaveAsync(SettingsKey, this.TextBox1.Text);
}

// bw: サスペンドに入るときに呼び出されるイベントハンドラー(Suspend and Resume機能)
private async void OnBackgroundEntering(object sender, OnBackgroundEnteringEventArgs e)
{
    // サスペンドに入るときにテキストボックスの内容を保存(Settings Storage機能)
    await ApplicationData.Current.LocalSettings.SaveAsync(SettingsKey, this.TextBox1.Text);
}

 これで、Mainページのテキストボックスに入力した文字列は、他のページに移動しても、アプリを終了させても、再びMainページを表示したときに復元されるようになります。

 なお、OnBackgroundEnteringイベントハンドラーで、あまり時間の掛かる処理をやってはいけません。処理の途中でサスペンドされてしまう可能性があります。また、ページの状態を復元することだけが目的なら(LocalSettingsに保存する意味がそれほどないのなら)、LocalSettingsにデータを保存するのではなく、Suspend and Resume機能の方のデータ復元機能を使ってください。

次のページ
もう1つの画面遷移

関連リンク

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

UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11282 2019/01/09 11:00

イベント

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

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

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

メールバックナンバー