MSDN のガイドラインに従って、すべてのアプリの設定を SettingsPane に配置する必要があり、設定が適用されると、アプリはすべてのページを更新する必要があります。
私のアプリでは、アプリをデフォルト設定に戻すリセットオプションが必要です。リセット ボタンが押されたときに更新する必要がある Calendar.xaml と HistoryStatistics.xaml の 2 つのページがあります。アプリのすべてのデータは、CycleManager というシングルトン クラスに配置されます。Callisto Toolkit の SettingsFlyout コントロールを使用しました。
App.Xaml
App.xamlに設定を登録
SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
そしてOnCommandsRequested
関数で、リセットハンドラを作成しました
var reset = new SettingsCommand("reset", "Reset", (handler) =>
{
var settings = new SettingsFlyout();
settings.Content = new ResetUserControl();
settings.HeaderBrush = new SolidColorBrush(_background);
settings.Background = new SolidColorBrush(_background);
settings.HeaderText = "Reset";
settings.IsOpen = true;
});
args.Request.ApplicationCommands.Add(reset);
CycleManager.cs
CycleManager クラスには、m_Reset 変数、そのセッターとゲッター、および ResetClicked というイベント ハンドラーがあります。
public event EventHandler ResetClicked;
public bool Reset
{
get
{
return m_reset;
}
set
{
m_reset = value;
if (ResetClicked != null)
ResetClicked(this, EventArgs.Empty);
}
}
次は、最初のクラス calendar.xaml でこのハンドラーを関連付けた部分です。
カレンダー.xaml
クラスのコンストラクターで、イベント ハンドラーを宣言します。
CycleManager pCycMan = CycleManager.Instance;
pCycMan.ResetClicked += this.ResetClicked;
続いて、イベント ハンドラーの定義
private async void ResetClicked(object sender, EventArgs e)
{
CycleManager pCycMan = CycleManager.Instance;
if (pCycMan.Reset == true)
{
try
{
await Windows.Storage.ApplicationData.Current.ClearAsync(Windows.Storage.ApplicationDataLocality.Local);
pCycMan.InitializeValues();
}
catch (Exception)
{
}
}
CreateCalendar();// UI is loaded
}
HistoryStatistics.xaml のコンストラクターで、上記と同じことを行いました
HistoryStatistics.xaml
public HistoryStatistics()
{
CycleManager pCycMan = CycleManager.Instance;
pCycMan.ResetClicked += this.ResetClicked;
}
と定義
private void ResetClicked(object sender, EventArgs e)
{
CycleManager pCycMan = CycleManager.Instance;
if (pCycMan.Reset == true)
{
await Windows.Storage.ApplicationData.Current.ClearAsync(Windows.Storage.ApplicationDataLocality.Local);
pCycMan.InitializeValues();
LoadListView();// loads the UI
DisplayStatistics();//loads the UI for the page
}
}
今問題
これは正しいアプローチですか?
2 番目のページ (HistoryStatistcs) から最初にリセットが押されると、最初のページ (Calendar.xaml.cs) で宣言されたリセット クリック関数が最初に呼び出され、次に HistoryStatistics の関数が呼び出されます。そして、両方が非同期で実行されます! :(これは正しい行動ですか?
この質問はかなり長いです。誰もがシナリオと質問を理解してくれることを願っています。