调用 Frame.GoBack 时得到 "Value does not fall withint the expected range"

Getting "Value does not fall withint the expected range" when calling to Frame.GoBack

我正在创建一个 Windows 使用导航(通过框架)的通用应用程序。

我想创建一个可重复使用的 Page 以避免创建多个页面。这个想法是一遍又一遍地使用相同的 Page (相同的类型,而不是相同的实例)。

为了在每个导航中显示不同的内容,我只是在 Frame.Navigate 调用的参数中传递页面内容,如下所示:

Frame.Navigate(typeof(ReusablePage), myContent);

为了说明我的想法。我已经为我的概念验证 UWP 应用程序创建了一个非常简单、最小且可重现的示例。问题是它抛出,我不知道为什么。这是代码:

(请参阅 post 末尾的确切问题)

MainPage.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal">
        <Button Content="Navigate" Tapped="Navigate" />
        <Button Content="Go back" Tapped="GoBack" IsEnabled="False" x:Name="BackButton" />
    </StackPanel>
    <Frame Grid.Row="1" x:Name="MyFrame" />
</Grid>

MainPage.xaml.cs

using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

namespace App4
{
    public sealed partial class MainPage : Page
    {
        private int times = 0;

        public MainPage()
        {
            this.InitializeComponent();
        }

        private void GoBack(object sender, TappedRoutedEventArgs e)
        {
            if (MyFrame.CanGoBack)
            {
                MyFrame.GoBack();
            }
        }

        private void Navigate(object sender, TappedRoutedEventArgs e)
        {
            MyFrame.Navigate(typeof(ReusablePage), new Button() { Content = $"Navigated {++times} times"});
            BackButton.IsEnabled = MyFrame.CanGoBack;
        }
    }
}

ReusablePage.xaml

<Page
    x:Class="App4.ReusablePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App4"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

</Page>

ReusablePage.xaml.cs

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace App4
{
    public sealed partial class ReusablePage : Page
    {
        public ReusablePage()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            Content = (UIElement) e.Parameter;
            base.OnNavigatedTo(e);
        }
    }
}

重现问题:

  1. 运行申请
  2. 单击导航按钮直到转到 后退按钮启用
  3. 单击 "Go back" 按钮(至少单击两次)。
  4. 你应该得到一个 System.ArgumentException

Value does not fall within the expected range

您可以尝试将此代码添加到 ReusablePage 构造函数中。

public ReusablePage()
{
    InitializeComponent();
    NavigationCacheMode = NavigationCacheMode.Enabled;
}

同时,您还可以使用e.NavigationMode来确定导航到页面的方式。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if(e.NavigationMode == NavigationMode.Back)
    {
        // Do something.
    }
    base.OnNavigatedTo(e);
}

渲染可视化树时出现错误。报错没有更详细的解释,但是缓存页面可以有效解决这个问题。

此致。