【发布时间】:2018-03-06 02:08:16
【问题描述】:
我有一个具有以下基本页面导航结构的语言学习应用:
- 开始 - 应用标题屏幕
- 语言 - 语言列表
- 课程 - 所选语言的课程列表
- 活动 - 包含所选课程的活动页面
前三页各有一个按钮导航到下一页,调用类似于:
private void ButtonClick(object sender, RoutedEventArgs e) => Frame.Navigate(typeof(SomePage));
在“活动”页面上,在用户通过按下按钮提交最后一个正确答案后,应用会像这样导航回来:
private async void SubmitAnswer_Click(object sender, RoutedEventArgs e)
{
...
if (answerCorrect && allActivitiesComplete)
{
Frame.GoBack();
return;
}
...
}
这有效;我返回到“课程”页面。如果我使用 IntelliSense 将鼠标悬停在 Frame 上,我会看到 BackStack 属性的计数为 3,之前的每一页都有一个。
但是,我还想显示软件后退按钮。为此,我有以下代码:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
...
var nav = SystemNavigationManager.GetForCurrentView();
nav.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
...
}
好的,现在按钮在桌面模式下显示在左上角。但是按下它什么也没做。所以我更新了以下内容:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
...
var nav = SystemNavigationManager.GetForCurrentView();
nav.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
nav.BackRequested += (x, y) =>
{
Frame.GoBack();
};
...
}
这失败:
Error HRESULT E_FAIL has been returned from a call to a COM component.
Frame.BackStack 显示0 的计数,而Frame.CanGoBack 是false。为什么这个代码流程和按钮按下代码流程不一致?
【问题讨论】:
-
应用级别的后退按钮应该在 应用级别 注册,或者如果您的应用使用导航视图,那么在具有导航逻辑的页面(通常是 MainPage)中,这样导航堆栈和您所指的框架始终相同,以保持整个应用程序的一致性。此外,在实际调用
Frame.GoBack()之前,最好检查一下 backstack 是否真的有任何页面if(Frame.CanGoBack){ // go back }
标签: c# uwp navigation windows-10-universal