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