1 回答
TA贡献1805条经验 获得超10个赞
问题实际上不在于连接的动画,而在于导航事件。
第一次到达时,SecondPage您连接了BackRequested活动,当您返回时,一切都很好。然而,事件处理程序停留配属到事件即使您在导航SecondPage。这是一个问题,因为一旦你SecondPage再次导航到,现在偶数将被注册两次。并且处理程序第一次运行时失败,因为第一个处理程序连接到页面的前一个实例,并且连接的动画已经完成了这个。最后 - 由于事件,页面将永远留在内存中,这可能会导致严重的内存泄漏。
解决方案非常简单 - 您必须确保在离开页面时不要忘记取消订阅偶数处理程序,例如在OnNavigatedFrom方法中并在OnNavigatedTo方法中订阅以获得更好的清晰度:
public sealed partial class SecondPage : Page
{
public SecondPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
SystemNavigationManager.GetForCurrentView().BackRequested -= SecondPage_BackRequested;
}
private void SecondPage_BackRequested(object sender, BackRequestedEventArgs e)
{
ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("borderOut", MainBorder);
Frame?.GoBack();
e.Handled = true;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
SystemNavigationManager.GetForCurrentView().BackRequested += SecondPage_BackRequested;
var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation("borderIn");
animation?.TryStart(MainBorder);
}
}
为了避免这种问题,我通常在BackRequested中为整个应用程序设置事件,App并在启动时只订阅一次。然后,您可以将连接的动画代码放入OnNavigatedFrom方法中,而不必订阅BackRequested:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("borderOut", MainBorder);
}
- 1 回答
- 0 关注
- 174 浏览
添加回答
举报