我有一个Windows 8应用程序,其中有一个页面(Frame)用于显示项目列表和一个用于下载的页面。显示项目详细信息。我也在使用MVVM Light发送通知。
应用程序的用法如下:
打开主页
导航到列表页面
Frame.Navigate(typeof(MyPage));
选择项目
//Complete logic
Frame.GoBack();
回到主页面,我开始在视图模型中下载文件,我发送 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的所有实例或返回上一个实例?
如果我在记下问题之前遗漏了重要信息,请告诉我。
答案 0 :(得分:4)
这对我来说听起来很正常。 Windows 8中的默认导航行为是每次导航到新页面时创建新的页面实例,无论这是前向还是后向导航。
尝试将NavigatinCacheMode
上的MainPage
设置为Required
。请参阅MSDN documentation for details of how page caching works。
答案 1 :(得分: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
}