21

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

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

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

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

语言更改为“de”,但是当我在页面上按“返回”时,它导航到同一页面而不是导航到上一页。我错过了什么,有人可以解释一下如何做到这一点。提前致谢

4

2 回答 2

16

这将刷新您的页面:

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

需要注意的是,我的示例不考虑页面参数,您可能需要。另外,另一个警告,我的示例会重新加载您的页面两次。但是 GoBack() 是从 BackStack 中删除新条目所必需的。与 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()); }
}
于 2013-01-09T21:16:25.980 回答
1

我不确定我是否完全理解您要执行的操作,因此这可能是错误的。

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

您是否使用任何类型的设计模式?对于这样的事情,我使用 MVVM(使用 MVVM 灯光库),它实现了一个非常酷的导航服务,可以控制这样的事情。

于 2012-09-10T10:01:02.717 回答