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