UWP - 框架导航仅在传递参数时崩溃
UWP - Frame Navigate only crashes when passing a parameter
我试图将被点击元素的 ID 作为字符串传递到新页面,但应用程序总是崩溃。我不完全确定如何找出问题的原因,因为我发现的每个示例都使用相同的方法并且对它们来说效果很好。
发件人事件:
private void MovieBox_OnTapped(object sender, TappedRoutedEventArgs e)
{
var id = (sender as StackPanel).Tag as string;
Debug.WriteLine(id); //the correct id in string
Frame.Navigate(typeof(MovieDetailsPage),id);
}
OnNavigatedTo 事件
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string text = e.Parameter as string;
Debug.WriteLine(text);
await Task.CompletedTask;
}
应用程序崩溃似乎介于两者之间。在第一个事件上放置断点显示发送了正确的 ID,但它永远不会到达 OnNavigatedTo。
我不确定是什么问题,因为如果我删除该参数,第二页加载得很好。
编辑:
我从 App.g.i.cs 文件中写入异常:
Exception thrown: 'Newtonsoft.Json.JsonReaderException' in MovieLibraryApp.exe
An exception of type 'Newtonsoft.Json.JsonReaderException' occurred in
MovieLibraryApp.exe but was not handled in user code
Unexpected character encountered while parsing value: m. Path '', line 0, position 0.
这是 xaml(有点乱的 atm):https://pastebin.com/GkXkxYDS
还有这个:
Your parameter must be serializable. If it isn't, then use SessionState
整个 .cs 页面,虽然我还没有在这里做任何逻辑,因为我从来没有让参数起作用。
MovieDetailsPage.xaml.cs:
public sealed partial class MovieDetailsPage
{
public MovieDetailsPage()
{
InitializeComponent();
NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter != null)
{
string text = Convert.ToString(e.Parameter);
}
}
}
提问者正在使用 Template10(在聊天期间了解它)所以以下是实现导航的最终和更新答案。
对于模板 10:
方式一
using Template10.Services.SerializationService;
...
string id = (string)(sender as StackPanel).Tag;
string str=SerializationService.Json.Serialize(id);
Frame.Navigate(typeof(MovieDetailPage), str);
方式二
var NavService = NavigationService.GetForFrame(this.Frame);
NavService.Navigate(typeof(MovieDetailPage), id);
我试图将被点击元素的 ID 作为字符串传递到新页面,但应用程序总是崩溃。我不完全确定如何找出问题的原因,因为我发现的每个示例都使用相同的方法并且对它们来说效果很好。
发件人事件:
private void MovieBox_OnTapped(object sender, TappedRoutedEventArgs e)
{
var id = (sender as StackPanel).Tag as string;
Debug.WriteLine(id); //the correct id in string
Frame.Navigate(typeof(MovieDetailsPage),id);
}
OnNavigatedTo 事件
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string text = e.Parameter as string;
Debug.WriteLine(text);
await Task.CompletedTask;
}
应用程序崩溃似乎介于两者之间。在第一个事件上放置断点显示发送了正确的 ID,但它永远不会到达 OnNavigatedTo。
我不确定是什么问题,因为如果我删除该参数,第二页加载得很好。
编辑: 我从 App.g.i.cs 文件中写入异常:
Exception thrown: 'Newtonsoft.Json.JsonReaderException' in MovieLibraryApp.exe
An exception of type 'Newtonsoft.Json.JsonReaderException' occurred in
MovieLibraryApp.exe but was not handled in user code
Unexpected character encountered while parsing value: m. Path '', line 0, position 0.
这是 xaml(有点乱的 atm):https://pastebin.com/GkXkxYDS
还有这个:
Your parameter must be serializable. If it isn't, then use SessionState
整个 .cs 页面,虽然我还没有在这里做任何逻辑,因为我从来没有让参数起作用。 MovieDetailsPage.xaml.cs:
public sealed partial class MovieDetailsPage
{
public MovieDetailsPage()
{
InitializeComponent();
NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter != null)
{
string text = Convert.ToString(e.Parameter);
}
}
}
提问者正在使用 Template10(在聊天期间了解它)所以以下是实现导航的最终和更新答案。
对于模板 10:
方式一
using Template10.Services.SerializationService;
...
string id = (string)(sender as StackPanel).Tag;
string str=SerializationService.Json.Serialize(id);
Frame.Navigate(typeof(MovieDetailPage), str);
方式二
var NavService = NavigationService.GetForFrame(this.Frame);
NavService.Navigate(typeof(MovieDetailPage), id);