Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用Frame.GoBack时获取“值不在预期范围内”_C#_.net_Uwp_Win Universal App - Fatal编程技术网

C# 调用Frame.GoBack时获取“值不在预期范围内”

C# 调用Frame.GoBack时获取“值不在预期范围内”,c#,.net,uwp,win-universal-app,C#,.net,Uwp,Win Universal App,我正在创建一个使用框架导航的Windows通用应用程序 我想创建一个可重用的页面,以避免创建多个页面。其思想是在同一类型上使用同一页面,而不是在同一实例上使用同一页面 为了在每个导航中显示不同的内容,我只需在框架的参数内传递页面内容。导航调用,如下所示: Frame.Navigate(typeof(ReusablePage), myContent); 来说明我的想法。我已经创建了一个非常简单、最少、可复制的UWP应用程序的概念验证示例。问题是它会抛出,我不知道为什么。代码如下: 请参见文章末尾

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

我想创建一个可重用的页面,以避免创建多个页面。其思想是在同一类型上使用同一页面,而不是在同一实例上使用同一页面

为了在每个导航中显示不同的内容,我只需在框架的参数内传递页面内容。导航调用,如下所示:

Frame.Navigate(typeof(ReusablePage), myContent);
来说明我的想法。我已经创建了一个非常简单、最少、可复制的UWP应用程序的概念验证示例。问题是它会抛出,我不知道为什么。代码如下:

请参见文章末尾的确切问题

MainPage.xaml 可重用页面.xaml 要重现问题,请执行以下操作:

运行应用程序 单击导航按钮,直到开始 “后退”按钮变为启用状态 点击返回按钮,至少点击两次。 你应该得到一个System.ArgumentException 值不在预期范围内


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

公共可重用页面 { 初始化组件; NavigationCacheMode=NavigationCacheMode.Enabled; } 同时,您还可以使用e.NavigationMode来确定导航到页面的方式

NavigatedToNavigationEventArgs e上的受保护覆盖无效 { ife.NavigationMode==NavigationMode.Back { //做点什么。 } 基于navigatedtoe; } 呈现可视化树时出错。对于这个错误没有更详细的解释,但是缓存页面可以有效地解决这个问题


致以最良好的祝愿。

问题是e.参数永远不会为空。它与向前导航页面时使用的按钮实例完全相同。请测试代码。谢谢你的鼓励。此错误可能是由控制冲突引起的。备份时,e.参数表示的按钮与页面上应显示的按钮相同,这可能导致应用程序在更新UI时无法正确判断更新的内容。因此,从理性的角度来看,我建议传递数据参数而不是控制参数,例如传递时间而不是传递按钮。我理解你的想法,但传递已呈现到VisualTree中的控件不是一个好方法。您可以尝试将创建控件的过程放在页面中,并根据传入的数据将其呈现到不同的控件中。我的意思是将创建UIElement的工厂放在可重用页面中,并仅传递数据。这就像把零件传递到目的地组装一样。
<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>
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;
        }
    }
}
<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>
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);
        }
    }
}