模板 10 导航失败(Windows.UI.Xaml.Controls.Frame.NavigationFailed 未处理)
Template 10 Navigation fails (Windows.UI.Xaml.Controls.Frame.NavigationFailed was unhandled)
我似乎无法在 Template10 中使用传统导航。我总是收到导航失败错误。 Template10 是否要求我使用 'XAML behavior style' 导航而不是像以前那样使用导航背后的代码?
我也在捕获内部异常,这些是我在那里看到的错误:
解析值时遇到意外字符:h。路径 '',第 0 行,位置 0。
您的参数必须是可序列化的。如果不是,则使用 SessionState。
(但我的参数只是一个字符串)
private void lvResults_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
int intIndex = lvResults.SelectedIndex;
string strShowLink = g_ro.webPages.value[intIndex].displayUrl;
//This is what is returned in the line above and I want it as my passed parameter :
//https://www.grc.com/sn/sn-482.htm
//Open Detailspage sending parameter as a string
Frame.Navigate(typeof(BlankPage1),strShowLink);
}
catch (Exception ex)
{
//Error caught in app.xaml.cs (UnhandleExceptio)
//Windows.UI.Xaml.Controls.Frame.NavigationFailed was unhandled.
string strEx = ex.Message;
}
前提是您正在使用 MVVM 实践并将视图模型设置为相关页面中的数据上下文(View-First)。该视图模型将继承默认情况下确实具有 NavigationService 属性 的 ViewModelBase 。否则,您将继承 INavigable 构建您自己的视图模型并通过 INavigable 界面设置 "required" 的项目。
这也引入了关注点与视图的分离,只负责 "showing" 不做(除非它与视图相关)和处理视图模型 "Clicks, Selections, etc" 上的
请记住,这也会促使您按定义的类型绑定属性 x:Bind
或延迟绑定 "{Binding SomeProperty}"
我做了一个基本的demo,重现了你的问题。我查看了模板 10 的源代码,发现模板 10 在 frame.Navigating 上添加了一个事件,如下所示:
frame.Navigating += (s, e) => FacadeNavigatingCancelEventHandler(s, e);
private async void FacadeNavigatingCancelEventHandler(object sender, NavigatingCancelEventArgs e)
{
...
object parameter = null;
try
{
parameter = SerializationService.Deserialize(e.Parameter?.ToString());
}
catch (Exception ex)
{
throw new Exception("Your parameter must be serializable. If it isn't, then use SessionState.", ex);
}
...
}
因此它会在导航时尝试反序列化您的参数。您必须先序列化您的参数,如下所示:
using Template10.Services.SerializationService;
...
string param = @"https://www.grc.com/sn/sn-482.htm";
string str=SerializationService.Json.Serialize(param);
Frame.Navigate(typeof(OtherPage), str);
错误将消失。但是如果你只是想在代码隐藏上导航,你也可以像下面这样使用 NavigationService:
string param = @"https://www.grc.com/sn/sn-482.htm";
var NavService = NavigationService.GetForFrame(Frame);
NavService.Navigate(typeof(OtherPage), param);
我似乎无法在 Template10 中使用传统导航。我总是收到导航失败错误。 Template10 是否要求我使用 'XAML behavior style' 导航而不是像以前那样使用导航背后的代码?
我也在捕获内部异常,这些是我在那里看到的错误:
解析值时遇到意外字符:h。路径 '',第 0 行,位置 0。 您的参数必须是可序列化的。如果不是,则使用 SessionState。
(但我的参数只是一个字符串)
private void lvResults_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
int intIndex = lvResults.SelectedIndex;
string strShowLink = g_ro.webPages.value[intIndex].displayUrl;
//This is what is returned in the line above and I want it as my passed parameter :
//https://www.grc.com/sn/sn-482.htm
//Open Detailspage sending parameter as a string
Frame.Navigate(typeof(BlankPage1),strShowLink);
}
catch (Exception ex)
{
//Error caught in app.xaml.cs (UnhandleExceptio)
//Windows.UI.Xaml.Controls.Frame.NavigationFailed was unhandled.
string strEx = ex.Message;
}
前提是您正在使用 MVVM 实践并将视图模型设置为相关页面中的数据上下文(View-First)。该视图模型将继承默认情况下确实具有 NavigationService 属性 的 ViewModelBase 。否则,您将继承 INavigable 构建您自己的视图模型并通过 INavigable 界面设置 "required" 的项目。
这也引入了关注点与视图的分离,只负责 "showing" 不做(除非它与视图相关)和处理视图模型 "Clicks, Selections, etc" 上的
请记住,这也会促使您按定义的类型绑定属性 x:Bind
或延迟绑定 "{Binding SomeProperty}"
我做了一个基本的demo,重现了你的问题。我查看了模板 10 的源代码,发现模板 10 在 frame.Navigating 上添加了一个事件,如下所示:
frame.Navigating += (s, e) => FacadeNavigatingCancelEventHandler(s, e);
private async void FacadeNavigatingCancelEventHandler(object sender, NavigatingCancelEventArgs e)
{
...
object parameter = null;
try
{
parameter = SerializationService.Deserialize(e.Parameter?.ToString());
}
catch (Exception ex)
{
throw new Exception("Your parameter must be serializable. If it isn't, then use SessionState.", ex);
}
...
}
因此它会在导航时尝试反序列化您的参数。您必须先序列化您的参数,如下所示:
using Template10.Services.SerializationService;
...
string param = @"https://www.grc.com/sn/sn-482.htm";
string str=SerializationService.Json.Serialize(param);
Frame.Navigate(typeof(OtherPage), str);
错误将消失。但是如果你只是想在代码隐藏上导航,你也可以像下面这样使用 NavigationService:
string param = @"https://www.grc.com/sn/sn-482.htm";
var NavService = NavigationService.GetForFrame(Frame);
NavService.Navigate(typeof(OtherPage), param);