Storyboard.Completed和OnNavigatingFrom。 如何正确地做动画?

2019-10-19 03:08发布

我想使简单的动画,当用户导航到并从应用的一些页面。 以下是我对现在:

XAML:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.Projection>
        <PlaneProjection CenterOfRotationY="1"/>
    </Grid.Projection>
    <Grid.Resources>
        <Storyboard x:Name="OnNavTo">
            <DoubleAnimation
                Storyboard.TargetName="LayoutRoot"
                Storyboard.TargetProperty="(Projection).(PlaneProjection.RotationX)"
                From="-110" To="0" Duration="0:0:0.3" />
        </Storyboard>
        <Storyboard x:Name="OnNavFrom">
            <DoubleAnimation
                Storyboard.TargetName="LayoutRoot"
                Storyboard.TargetProperty="(Projection).(PlaneProjection.RotationX)"
                From="0" To="-110" Duration="0:0:1.3" />
        </Storyboard>
    </Grid.Resources>
    <phone:Pivot Title="{Binding LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}">
        <!-- My page stuff here -->
    </phone:Pivot>
</Grid>

C#:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    OnNavTo.Begin();
}

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

的OnNavigatedTo工作正常。 当我点击按钮,打开相应的页面,将其与动画打开。 但是,当我按下返回按钮,页面干脆关门,没有任何动画。 请点我在正确的方向

(我宁愿后端Python开发,并在Windows手机和.NET的东西绝对小白)。

UPD正如指出的gaurav5430。

第一:我已经注意到,我使用OnNavigatedFrom代替OnNavigatingFrom

第二:动画是异步的,所以我需要等到它完成之前实际关闭页面。 在这一点上,我来到了以下情况:

XAML: <Storyboard x:Name="OnNavFrom" Completed="OnNavFrom_Completed">

C#:

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();
}

它的工作。 虽然我知道这是不是对付事件的最好办法。 我敢肯定,C#有很好的方法来做到这一点,而无需调用NavigationService两次(第一次当用户按下背部和第二动画完成时)。 由gaurav5430提供的链接包含示例的代码。 但我不明白它是如何工作的。 我认为这段代码是太小了,对于我这样的新手来说,要明白什么是幕后操纵者。

所以可以

Answer 1:

这是很可能的是,网页已经从导航和不等待动画完成。

我的建议是调用所有的函数调用之前base.OnNavigatedFrom(e)因为这可能是其中规定了导航功能,所以基本上你可以试试

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

    }

请注意,这仍然不能确保它等待你的动画来完成,作为动画可能会播放异步。 所以也许你可以尝试调用之前加入一些延迟base.OnNavigatedFrom()

还可能会检查此链接了

http://www.silverlightshow.net/items/Windows-Phone-7-Part-3-Understanding-navigation.aspx



Answer 2:

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

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
    //...
}


文章来源: Storyboard.Completed and OnNavigatingFrom. How to do animation correctly?