在Metro应用程序C#中重新加载页面

时间:2012-09-10 09:47:46

标签: c# xaml windows-8 windows-runtime

我正在使用Windows 8 RTM和C#(VS 2012 RTM)开发metro应用程序,我遇到了页面重新加载, 任何人都可以解释我如何重新加载页面而不再导航到同一页面。 简介:我正在开发具有多语言支持的metro应用程序。当用户通过以下代码选择语言我覆盖主要语言时

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

并使用此代码重新加载页面

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

语言改为“de”,但当我在页面上按“返回”时导航同一页而不是导航到上一页。我想念一些事情,有人可以请你解释一下如何做到这一点。提前致谢

2 个答案:

答案 0 :(得分:16)

这将刷新您的页面:

var _Frame = Window.Current.Content as Frame;
_Frame.Navigate(_Frame.Content.GetType());
_Frame.GoBack(); // remove from BackStack
  • 处理OnNavigatingFrom()可以保存页面的数据和状态。
  • 处理OnNavigatingTo(),您可以加载页面的数据和状态。

作为警告,我的示例不考虑页面参数,您可能需要。 此外,另一个警告,我的样本重新加载您的页面两次。但是从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()); }
}

答案 1 :(得分:1)

我不确定我完全明白你要做什么,所以这可能是错的。

通过在刷新页面时调用该行代码,您将创建当前类型的全新对象并导航到该对象,因此这不会保存用户在当前页面上所做的更改。 / p>

您使用的是任何类型的设计模式吗?对于这样的事情,我使用MVVM(使用MVVM光库),它实现了一个非常酷的导航服务,这将保持这样的东西。