C# 情节提要。已完成并正在从中导航。如何正确制作动画?

C# 情节提要。已完成并正在从中导航。如何正确制作动画?,c#,xaml,animation,windows-phone,C#,Xaml,Animation,Windows Phone,我想在用户被导航到应用程序中的某个页面时制作简单的动画。以下是我目前的情况: XAML: OnNavigatedTo工作正常。当我点击按钮打开相应的页面时,它会以动画打开。但,当我按下“后退”按钮时,页面就简单地关闭了,没有任何动画。 请给我指出正确的方向 (我是一个相当后端的python开发人员,绝对是Windows Phone和.NET之类的noob) UPD 正如gaurav5430所指出的 第一:我注意到,我使用的是OnNavigatedFrom而不是OnNavigatingFrom 第

我想在用户被导航到应用程序中的某个页面时制作简单的动画。以下是我目前的情况:

XAML:

OnNavigatedTo工作正常。当我点击按钮打开相应的页面时,它会以动画打开。但,当我按下“后退”按钮时,页面就简单地关闭了,没有任何动画。 请给我指出正确的方向

(我是一个相当后端的python开发人员,绝对是Windows Phone和.NET之类的noob)

UPD 正如gaurav5430所指出的

第一:我注意到,我使用的是
OnNavigatedFrom
而不是
OnNavigatingFrom

第二:动画是异步的,所以我需要等到它完成后才真正关闭页面。在这一点上,我得出以下结论:

XAML:

C#:

它起作用了。虽然我知道这不是处理事件的最佳方式。我敢肯定C#有很好的方法可以做到这一点,而无需调用
NavigationService
两次(第一次是在用户按back时,第二次是在动画完成时)。 gaurav5430提供的链接包含代码示例。但我不明白它是怎么工作的。我认为这段代码太小,像我这样的新手无法理解幕后的情况


因此可以

很有可能页面已经从中导航,并且没有等待动画完成

我建议在调用
base.OnNavigatedFrom(e)
之前调用所有函数,因为这可能是设置导航的函数,所以基本上您可以尝试

   protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
     OnNavFrom.Begin();
        base.OnNavigatedFrom(e);

    }
请注意,这仍然不能确保它等待动画完成,因为动画可能是异步播放的。因此,您可以尝试在调用
base.OnNavigatedFrom()之前添加一些延迟

您也可以查看此链接


谢谢,在此基础上,我不得不添加一些改进

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    //base.OnNavigatedTo(e); //this call isn't necessary
    if (e.NavigationMode == NavigationMode.New)
    {
       storyboardTo.Begin();
    }
    //if NavigationMode is Back then don't play the animation

    //...
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (e.NavigationMode != NavigationMode.Back)
    {//leave the page due to long back button or Windows button, stay on the page
        e.Cancel = true;
        return;
    }

    //...
    //base.OnNavigatingFrom(e); //this call isn't necessary
    //...
}

谢谢你给我指出了正确的方向和链接。我认为你的回复和链接包含了处理这个问题的所有信息。但我还是不知道怎么做。我已经更新了我的问题。
private bool cancelExit = true;

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    e.Cancel = cancelExit;
    if (cancelExit)
    {
        OnNavFrom.Begin();
    }
    else
    {
        base.OnNavigatingFrom(e);
    }
}

private void OnNavFrom_Completed(object sender, EventArgs e)
{
    cancelExit = false;
    NavigationService.GoBack();
}
   protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
     OnNavFrom.Begin();
        base.OnNavigatedFrom(e);

    }
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    //base.OnNavigatedTo(e); //this call isn't necessary
    if (e.NavigationMode == NavigationMode.New)
    {
       storyboardTo.Begin();
    }
    //if NavigationMode is Back then don't play the animation

    //...
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (e.NavigationMode != NavigationMode.Back)
    {//leave the page due to long back button or Windows button, stay on the page
        e.Cancel = true;
        return;
    }

    //...
    //base.OnNavigatingFrom(e); //this call isn't necessary
    //...
}