1

我有一个适用于 Windows 8 的应用程序,其中包含一个用于显示项目列表的页面(框架)和一个用于下载和显示项目详细信息的页面。我也在使用 MVVM Light 发送通知。

应用程序的使用是这样的:

  1. 打开主页

  2. 导航到列表页面

    Frame.Navigate(typeof(MyPage));
    
  3. 选择项目

    //Complete logic
    Frame.GoBack();
    
  4. 回到主页,我开始在视图模型中下载文件,我发送ONE NotificationMessage 说 BeginDownloadFile,下载后ONE NotificationMessage 说 EndDownloadFile。

我第一次执行步骤 2,3 和 4 时,我的 NotificationReceived 方法被击中一次,第二次被击中两次,依此类推。

private async void NotificationMessageReceived(NotificationMessage msg)
{
    if (msg.Notification == Notifications.BeginDownloadFile)
    {
       FileDownloadPopup.IsOpen = true;
    }
    else if (msg.Notification == Notifications.EndDownloadFile)
    {
       FileDownloadPopup.IsOpen = false;
    }
}

附加信息:我只有一个 FileDownloadPopup,但每次调用 NotificationMessageReceived 方法时都会显示一个附加弹出窗口。

我唯一的结论是,在我的应用程序中向前和向后导航之间,有多个 MainPages 被创建并且从未关闭。这导致许多 NotificationsMessageReceived 方法只是等待通知出现,以便他们可以显示他们的弹出窗口。

我有两个问题: 1. 这听起来像是 Windows 8 应用程序的正常行为吗?2、如何关闭MainPage的所有实例或返回上一个实例而不创建新实例?

在标记我的问题之前,请让我知道我是否错过了一些重要的事情。

4

2 回答 2

4

这对我来说听起来很正常。Windows 8 中的默认导航行为是在每次导航到新页面时创建一个新页面实例,无论这是向前导航还是向后导航。

尝试将NavigatinCacheModeon设置MainPageRequired. 有关页面缓存如何工作的详细信息,请参阅MSDN 文档。

于 2012-12-05T06:31:44.743 回答
3

听起来您正在页面中注册事件处理程序,然后不删除它们。每次您再次导航到该页面时,除了您之前添加的处理程序之外,还会再次添加处理程序。尝试在 OnNavigatedTo 中添加您的事件处理程序,并确保在 OnNavigatedFrom 中取消注册它。

protected override void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
    MyEvent.OnDownloadRequest += MyLocalDOwnloadHandler;  // add the handler
}

protected override void OnNavigatedFrom(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
    MyEvent.OnDownloadRequest -= MyLocalDOwnloadHandler;  // remove the handler
}
于 2012-12-05T08:54:00.057 回答