1 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
問題實(shí)際上不在于連接的動(dòng)畫,而在于導(dǎo)航事件。
第一次到達(dá)時(shí),SecondPage您連接了BackRequested活動(dòng),當(dāng)您返回時(shí),一切都很好。然而,事件處理程序停留配屬到事件即使您在導(dǎo)航SecondPage。這是一個(gè)問題,因?yàn)橐坏┠鉙econdPage再次導(dǎo)航到,現(xiàn)在偶數(shù)將被注冊兩次。并且處理程序第一次運(yùn)行時(shí)失敗,因?yàn)榈谝粋€(gè)處理程序連接到頁面的前一個(gè)實(shí)例,并且連接的動(dòng)畫已經(jīng)完成了這個(gè)。最后 - 由于事件,頁面將永遠(yuǎn)留在內(nèi)存中,這可能會(huì)導(dǎo)致嚴(yán)重的內(nèi)存泄漏。
解決方案非常簡單 - 您必須確保在離開頁面時(shí)不要忘記取消訂閱偶數(shù)處理程序,例如在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中為整個(gè)應(yīng)用程序設(shè)置事件,App并在啟動(dòng)時(shí)只訂閱一次。然后,您可以將連接的動(dòng)畫代碼放入OnNavigatedFrom方法中,而不必訂閱BackRequested:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("borderOut", MainBorder);
}
- 1 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)