Uwp 模板10导航失败(未处理Windows.UI.Xaml.Controls.Frame.NavigationFailed)

Uwp 模板10导航失败(未处理Windows.UI.Xaml.Controls.Frame.NavigationFailed),uwp,template10,Uwp,Template10,我似乎无法在Template10中使用传统导航。我总是遇到导航失败的错误。Template10是否要求我使用“XAML行为风格”导航,而不是像以前那样使用代码隐藏导航 我还捕获了内部异常,这些是我在那里看到的错误: 分析值h时遇到意外字符。路径“”,第0行,位置0。 您的参数必须是可序列化的。如果不是,则使用SessionState (但我的参数只是一个字符串) 前提是您正在使用MVVM实践,并且在相关页面中将viewmodel设置为datacontext(视图优先)。该viewmodel将继承

我似乎无法在Template10中使用传统导航。我总是遇到导航失败的错误。Template10是否要求我使用“XAML行为风格”导航,而不是像以前那样使用代码隐藏导航

我还捕获了内部异常,这些是我在那里看到的错误:

分析值h时遇到意外字符。路径“”,第0行,位置0。 您的参数必须是可序列化的。如果不是,则使用SessionState

(但我的参数只是一个字符串)


前提是您正在使用MVVM实践,并且在相关页面中将viewmodel设置为datacontext(视图优先)。该viewmodel将继承ViewModelBase,默认情况下它确实具有NavigationService属性。否则,您将继承Inaviable构建自己的viewmodel,并设置Inaviable接口“必需”的项

这还引入了关注点与视图的分离,仅负责“显示”不执行操作(除非与视图相关)以及处理viewmodel上的“单击、选择等”


请记住,这也会促使您按定义的类型绑定属性
x:bind
或延迟绑定
“{binding SomeProperty}”

我做了一个基本演示,重现了您的问题。我查看了模板10的源代码,发现模板10在框架上添加了一个事件。如下所示:

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);
string param = @"https://www.grc.com/sn/sn-482.htm";
var NavService = NavigationService.GetForFrame(Frame);
NavService.Navigate(typeof(OtherPage), param);
因此,它将在导航时尝试反序列化您的参数。您必须先序列化参数,如下所示:

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);
string param = @"https://www.grc.com/sn/sn-482.htm";
var NavService = NavigationService.GetForFrame(Frame);
NavService.Navigate(typeof(OtherPage), param);
错误就会消失。但如果您只是想在代码隐藏中导航,也可以使用如下导航服务:

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);
string param = @"https://www.grc.com/sn/sn-482.htm";
var NavService = NavigationService.GetForFrame(Frame);
NavService.Navigate(typeof(OtherPage), param);

请尝试导航服务,而不是Frame.Navigate()。Navigate()导航服务没有给我导航选项。我认为模板10会自动向每个页面公开导航服务。我需要先在某个地方实例化它吗?谢谢,这就是我缺少的“var NavService=NavigationService.GetForFrame(Frame);”现在我可以通过代码beind进行导航了