我必须开发一个使用循环导航的WP8应用程序。我来自Android,我是WP8的新手,所以如果我说一些愚蠢的话,请原谅我。
当用户启动我的应用程序时,他从页面 A.xaml 开始,然后他可以使用左键导航到 C.xaml 或使用右键导航到 B.xaml。从B.xaml,他可以用左边回到A.xaml,用右边回到C.xaml,而从C.xaml右边回到A.xaml,而左边通向B.xaml。我有 3 个整数:NA、NB 和 NC,它们只能分别在 A、B 或 C 中修改,但显示在所有 3 个整数中,所以我总是传递这些参数。
用户可能会在"页面"之间快速导航,所以我不介意让它们保持活动状态,而不是每次都销毁和重新创建它们。
我的初始代码是这样的(我省略了显示 NA、NB 和 NC 的部分):
A.xaml:
int NA = 0;
int NB = 0;
int NC = 0;
public APage()
{
InitializeComponent();
NA= Convert.ToInt32(PhoneApplicationService.Current.State["NA"]);
NB= Convert.ToInt32(PhoneApplicationService.Current.State["NB"]);
NC= Convert.ToInt32(PhoneApplicationService.Current.State["NC"]);
UpdateA(NA);
UpdateB(NB);
UpdateC(NC);
}
public void ToC_click(object sender, RoutedEventArgs e)
{
PhoneApplicationService.Current.State["NA"] = NA;
PhoneApplicationService.Current.State["NB"] = NB;
PhoneApplicationService.Current.State["NC"] = NC;
NavigationService.Navigate(new Uri("/C.xaml", UriKind.Relative));
}
public void ToB_click(object sender, RoutedEventArgs e)
{
PhoneApplicationService.Current.State["NA"] = NA;
PhoneApplicationService.Current.State["NB"] = NB;
PhoneApplicationService.Current.State["NC"] = NC;
NavigationService.Navigate(new Uri("/B.xaml", UriKind.Relative));
}
B.xaml有ToA_click
和ToC_click
方法,而C.xaml有ToA_click
和ToB_click
,它们只因导航中的uri而异。
B->A 时,我的应用程序崩溃了。我以为我一直堆叠到 ABCA 之类的东西并收到错误,所以我修改了"后退"按钮以NavigationService.GoBack()
我是否从 B 导航到 A 或从 C 导航到 B。通过这种修改,我能够A->B->C而不是向后或A->C->B,但我仍然不能A->B->C->A或A->C->B->A。
我想在这一点上我已经堆叠了所有 3 个 xaml,所以如果我无法返回,我必须清除堆栈然后重建它,但这样做我将不得不自己处理重置(有一些棘手的变量)在 A.xaml 和 C.xaml 中。
这是正确的实施方式吗?我认为拥有某种避免重新创建 xaml 的标志会很方便,而不是"玩"堆栈,但我还没有找到任何关于它的信息。我也觉得我错过了什么,我误解了WP8堆叠吗?
除了使用 Panorama
或 Pivot
控件(如 @Bas 所建议的那样)之外,我会考虑将其视为不是用 Page
s 解决的问题,而是通过单个Page
根据按下的按钮显示或隐藏不同的UserControl
。
基本上,在 Project -> 添加新项而不是 Page 中使用 UserControl 模板,然后不使用NavigationService.Navigate
在三种状态之间切换,而是在MainPage.xaml
中创建三个控件并切换每个控件的Visibility
以在正确的时间显示它。