如何从OnFrameNavigated处理程序中导航到新页面

时间:2014-02-21 10:26:42

标签: c# windows-phone-8 navigation windows-store-apps

我正在将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中开始编辑此项目:

  • call mediaEditor.Edit(MovieA) - >显示MovieA的MediaEditor
  • 从MediaEditor中选择编辑BookA - > MovieAditor for MovieA已关闭,MediaEditor for BoolB将显示

这是通过从OnFrameNavigated中调用Edit(BookA)来完成的。因此,完整的导航是:

  • call mediaEditor.Edit(MovieA) - > Frame.Navigate(typeof(MediaEditorPage),MovieA)
  • 选择编辑BookA - > Frame.GoBack()
  • 检测应在OnFrameNavigated中编辑BookA - > Frame.Navigate(typeof(MediaEditorPage),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 ;
        }
    }

}

0 个答案:

没有答案