我创建了一个继承自Page的自定义控件,用于为NavigatingFrom事件设置动画。但是,我似乎无法播放实际的动画。这是我完整的AltPage.cs代码:
public class AltPage : Page
{
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
//Set up the composition animation
var _compositor = new Compositor();
var _targetVisual = ElementCompositionPreview.GetElementVisual(this);
var animation = _compositor.CreateScalarKeyFrameAnimation();
animation.Duration = new TimeSpan(0, 0, 0, 0, 300);
animation.InsertKeyFrame(1.0f, 0f);
_targetVisual.StartAnimation("Opacity", animation);
//Give some time for the animation to start
Task.Delay(18);
//Get the page to initialize while the animation is playing
base.OnNavigatingFrom(e);
}
}
当我运行代码时,行_targetVisual.StartAnimation("Opacity", animation)
会提升System.UnauthorizedAccessException。我已告知"呼叫者不允许对此对象执行此操作"。我做错了什么?
答案 0 :(得分:1)
当我运行代码时,行_targetVisual.StartAnimation(“Opacity”,动画)会提升System.UnauthorizedAccessException。我被告知“不允许调用者对此对象执行此操作”。
Compositor
对象需要从当前页面的任何Visual
获取。您可以使用以下代码获取Compositor:
ElementCompositionPreview _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
在导航之前已经引发了{p> Page.OnNavigatingFrom,但是我们不能延迟阻止页面导航。当我们使用Task.Delay
时,我们需要一个await
来让它同步工作。但它会使整个函数异步运行(使用async
时将添加await
)。因此,如果您将代码放在OnNavigatingFrom
中,则无法获得预期的行为。
作为解决方法,您可以将代码放在Frame.Navigate之前,如下所示:
Compositor _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
Visual _targetVisual = ElementCompositionPreview.GetElementVisual(this);
var animation = _compositor.CreateScalarKeyFrameAnimation();
animation.Duration = new TimeSpan(0, 0, 0, 0, 3000);
animation.InsertKeyFrame(0.0f, 1.0f);
animation.InsertKeyFrame(1.0f, 0.0f);
_targetVisual.StartAnimation("Opacity", animation);
await Task.Delay(3000);//Give some time for the animation to start
Frame.Navigate(typeof(NewPage));
因此,您将获得一个页面淡入淡出的动画,我做了一个演示,您可以参考:CustomPageSample。