我正在将Windows Phone 8应用程序移植到Windows应用商店8.1,在从OnFrameNavigated处理程序中调用Frame.Navigate(...)时导航到新页面时出现问题。
长篇故事:
该应用程序管理不同的“媒体”对象,如书籍或电影。为了编辑这样一个元素的属性(标题,作者等),WP使用了一个自定义的“MediaEditor”控件,该控件受到了WP ToolKit中DatePicker的启发:
不是手动导航到编辑器/选取器页面,而是将编辑器/选取器封装在自己的类中。该类与ApplicationFrame挂钩,并自行处理Editor to Picker页面的导航。当ApplicationFrame导航回显示编辑器/选择器之前可见的页面/内容时,可以处理结果,例如,用挑选的日期发射一个事件。
与DatePicker相比,我的MediaEditor有一个区别: 如果当前编辑的MediaItem与另一个MediaItem相关(例如,电影A是图书A的电影版本),则可以直接从MediaEditor中开始编辑此项目:
这是通过从OnFrameNavigated中调用Edit(BookA)来完成的。因此,完整的导航是:
虽然这适用于Windows Phone,但这在Win 8.1上不起作用。 Frame.Navigate(typeof(MediaEditorPage),BookA)被简单地忽略。没有OnNavigationFailed,没有控制台输出,没有。该应用程序导航回第一页(原始名为mediaEditor.Edit(MovieA)的页面),没有其他任何事情发生。
这究竟是什么问题?
MediaEditor mediaEditor = new MediaEditor();
mediaEditor.Edit(bookItem);
public class MediaEditor {
private Frame applicationFrame;
private object frameContentWhenOpened;
public void Edit(MediaItem item) {
applicationFrame = Window.Current.Content as Frame;
if (applicationFrame != null) {
frameContentWhenOpened = applicationFrame.Content;
applicationFrame.Navigated += OnFrameNavigated;
applicationFrame.NavigationFailed += OnNavigationFailed;
applicationFrame.Navigate(typeof(MediaEditorPage), item);
}
}
void OnNavigationFailed(object sender, NavigationFailedEventArgs e) {
System.Diagnostics.Debug.WriteLine(e);
}
MediaEditorPage editorPage;
void OnFrameNavigated(object sender, NavigationFailedEventArgs e) {
if (e.Content == frameContentWhenOpened) {
applicationFrame.Navigated -= OnFrameNavigated;
applicationFrame.NavigationFailed -= OnNavigationFailed;
applicationFrame = null;
frameContentWhenOpened = null;
if (editorPage != null) {
if (editorPage.EditOtherItem)
// Directly start editing another Item
Edit(editorPage.OtherItem);
else
// Finish editing, fire Events, etc
}
} else {
editorPage = e.Content as MediaEditorPage ;
}
}
}