web-dev-qa-db-ja.com

メトロアプリC#でページをリロード

Windows 8を使用してメトロアプリを開発していますRTMおよびC#(VS 2012 RTM)、ページのリロードで立ち往生しています。同じページに移動せずにページをリロードする方法を教えてもらえますか?もう一度。簡単な:多言語をサポートするメトロアプリを開発しています。ユーザーが言語を選択すると、以下のコードでプライマリ言語をオーバーライドします。

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "de";

このコードを使用してページをリロードします

this.Frame.Navigate(this.GetType());

言語が「de」に変更されましたが、ページの「戻る」を押すと、前のページに移動するのではなく、同じページに移動します。何か見落としがありましたか。誰かがこれを行う方法を説明してくれますか。前もって感謝します

21
Raj Kumar

これにより、ページが更新されます。

var _Frame = Window.Current.Content as Frame;
_Frame.Navigate(_Frame.Content.GetType());
_Frame.GoBack(); // remove from BackStack
  • OnNavigatingFrom()を処理すると、ページのデータと状態を保存できます。
  • OnNavigatingTo()を処理すると、ページのデータと状態をロードできます。

警告として、私のサンプルはページパラメータを考慮していません。あなたがそうする必要があるかもしれません。また、別の注意点として、私のサンプルはページを2回リロードします。ただし、BackStackから新しいエントリを削除するには、GoBack()が必要です。 WPとは異なり、FrameにはRefresh()がありません。また、BackStackにはRemove()がありません。

[〜#〜]更新[〜#〜]

私はもはや上記のアプローチを使用しません。私はこれを使用します:

public bool Reload() { return Reload(null); }
private bool Reload(object param)
{
    Type type = this.Frame.CurrentSourcePageType;
    if (this.Frame.BackStack.Any())
    {
        type = this.Frame.BackStack.Last().SourcePageType;
        param = this.Frame.BackStack.Last().Parameter;
    }
    try { return this.Frame.Navigate(type, param); }
    finally { this.Frame.BackStack.Remove(this.Frame.BackStack.Last()); }
}
16
Jerry Nixon

あなたが何をしようとしているのか完全には理解できないので、これは間違っている可能性があります。

ページを更新するときにそのコード行を呼び出すことで、現在のタイプの新しいオブジェクトを作成してナビゲートすることになります。そのため、ユーザーが現在のページにいる間に行った変更は保存されません。

どんなタイプのデザインパターンを使用していますか?このようなもののために、私はMVVM(MVVMライトライブラリを使用)を使用します。これは、このようなものをチェックする本当にクールなナビゲーションサービスを実装します。

1
lookitskris