0

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
        }
    } 

今問題

  1. これは正しいアプローチですか?

  2. 2 番目のページ (HistoryStatistcs) から最初にリセットが押されると、最初のページ (Calendar.xaml.cs) で宣言されたリセット クリック関数が最初に呼び出され、次に HistoryStatistics の関数が呼び出されます。そして、両方が非同期で実行されます! :(これは正しい行動ですか?

この質問はかなり長いです。誰もがシナリオと質問を理解してくれることを願っています。

4

2 に答える 2

1

あなたが概説した動作に問題はありません。2 つのページがイベントにサブスクライブし、イベントはマルチキャスト デリゲートを使用します。つまり、両方が起動されます。

ここでは、より単純な動作が必要だと思います。各 xaml ページは、OnNavigatedTo でそのイベントをサブスクライブし、OnNavigatedFrom でサブスクライブを解除する必要があります。

そうすれば、2 つのうちの 1 つだけが実際にクリーンアップを実行します。

于 2013-05-23T15:25:10.043 に答える