後から画面や機能を追加する
Windows Template Studioのプロジェクトを作った後で、Windows Template Studioの画面や機能を追加することもできます。ソリューションエクスプローラーでプロジェクトの右クリックメニューを見ると[Windows Template Studio]というメニューが増えていて、そこから画面や機能を追加できます。
画面を追加する
ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから[Windows Template Studio]-[新しいページ]を選ぶと、次の画像のようなダイアログが出てきます。
追加するページを選び、右上のテキストボックスでページの名前を設定します。ここではChartページを追加してみましょう。[次へ]ボタンで、変更一覧画面に進みます(次の画像)。
この画面は、これから加える変更点の一覧です。重要なのは「修正したファイル」(原文は"Modified files"=「変更後のファイル」)の内容です。上の画像に見えるように、修正されるファイルの差分が表示されるので、既存のコードが破壊されないことを確認してください。問題なければ[作成]ボタンをクリックして変更を適用します。問題がありそうなら、左下の[変更をマージしない (一時フォルダーに作成)。]にチェックを付けてから[作成]ボタンをクリックし、後から手動で変更してください。
新しいページの追加に成功すると、次の画像のように変更一覧が表示されます。このGenerationSummary.mdファイルは一時フォルダーに作成されているので、必要なら名前を付けて別のフォルダーに保存してください(画像は別名で保存した後)。
実行してみると、次の画像のようなChartページが追加されています。
機能を追加する
機能を追加する方法も、同様です。ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから[Windows Template Studio]-[新しい機能]を選ぶと、次の画像のようなダイアログが出てきます。
追加する機能を選びます。ここではSuspend and Resume機能を追加してみましょう。[次へ]ボタンで、変更一覧画面に進みます(次の画像)。
この画面で修正されるファイルの差分を確認するのも、画面の追加と同じです。問題なければ[作成]ボタンをクリックして変更を適用します。
新しい機能の追加に成功すると、次の画像のように変更一覧が表示されます。このGenerationSummary.mdファイルも、やはり一時フォルダーに作成されています。
追加したSuspend and Resume機能の利用例
UWPアプリは、デスクトップでアイコン化されると(タブレットでは画面に表示されなくなると)、サスペンドされます。サスペンド状態ではCPUクロックがまったく割り当てられず、しかも、サスペンド状態から終了させられることもあります(この終了は、アプリには検知できません)。ということは、何か自動的にデータを保存する必要があるなら、サスペンド状態に入るときに保存しないといけません。
ここでは、Mainページのテキストボックスの文字列を自動的に保存し、次にMainページが表示されるときにはその文字列を復元してみましょう。データの保存先には、プロジェクト作成時に自動的に追加されていたSettings Storage機能を利用することにします。
Mainページのテキストボックスの文字列を保存するタイミングは、次の2つがあります(1文字入力されるごとに保存するのも不可能ではありませんが、やり過ぎというものでしょう)。
- 他のページへ移動するとき:OnNavigatedFromメソッド(UWPに元々備わっている機能)
- サスペンドに入るとき:OnBackgroundEnteringイベント(Suspend and Resumeの機能)
この2つのタイミングで、テキストボックスのデータを保存するコードは次のようになります。
// 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機能の方のデータ復元機能を使ってください。
