WPF:防止导航服务向后导航

WPF: Prevent Navigation Service from back navigation

我正在设计一个应用程序来更新设备上的固件并使用导航服务在页面之间自由移动。但是,我希望它一旦你点击实际的固件更新页面,你就不能再返回,只能前进。如果允许返回导航,我们可以将设备变砖,完成后,无论如何返回都没有意义。

第一次尝试是简单地删除 NavigationService.Back() 方法,但这仍然允许您返回 mouse/backspace。

第二次尝试来自另一个使用 RemoveBackEntry() 的 SO 问题。这删除了最后一个条目,但是,您仍然可以使用鼠标后退按钮,它会让您返回 2 页而不是一页(因为最后一页已删除)。

那么我们如何在到达页面后防止任何类型的后退导航?看起来这应该既简单又常见,但我找不到任何东西。

更新: 以下答案中的解决方案确实有效,但存在问题。固件更新后,下一页是 success/fail 页面,然后该应用将用户带回主页面,在那里他们可以 select 一个新的实用程序。如果在 运行 完成另一个实用程序之后选择了一个实用程序,则此后任何页面的后退导航仍然被阻止。

事实上,正在发生的事情是在另一个页面上按下后退按钮会调用许多页面返回的代码,从而阻止我们返回:

if(e.NavigationMode == NavigationMode.Back)
   e.Cancel = true;

我猜这是因为我们阻止返回导航的原始页面一直保持活动状态,并且从未触发 PageUnloaded 事件。那么我们如何才能防止在那个页面上返回导航并确保它只出现在那个页面上呢?

我在想另一种可能的解决方案是,一旦实用程序启动,我们就删除整个导航日志。因为一旦固件更新开始,在导航之前发生的事情就完全无关紧要了,因为用户总是会返回到主页。这行得通吗?

你可以尝试使用 Navigating 事件,类似的东西

void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back && ...)
    {
        e.Cancel = true;
    }
}

您可以添加到 if 子句检查 NavigatingCancelEventArgsUriContent 以跳过导航到所需页面(或使用一些 属性来自 Page/Frame)

你也可以看看MSDN to get more details, this article也很有帮助