2017-11-11 3 views
0

ビジュアルレイヤーでアニメーションを作成して開始する場合は、StopAnimationを使用してアニメーションを停止できます。しかし、私がそうすると、アニメーションが停止してプロパティが最新の値で更新されるまでに時間がかかるようです。その周りにいくつかの方法がありますか?以下のコードでは、10ミリ秒待つが、それはときどき動作する。アニメーションが停止してプロパティが更新されたときを検出するにはどうすればよいですか?

public sealed partial class MainPage : Page 
{ 
    SpriteVisual MyVisual; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     PointerReleased += MainPage_PointerReleased; 
    } 


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

     var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; 

     MyVisual = compositor.CreateSpriteVisual(); 

     MyVisual.Size = new Vector2(80, 80); 
     MyVisual.Offset = new Vector3(50, 50, 0); 
     MyVisual.Brush = compositor.CreateColorBrush(Colors.Green); 

     ElementCompositionPreview.SetElementChildVisual(this, MyVisual); 

     var animation = compositor.CreateVector3KeyFrameAnimation(); 
     animation.InsertKeyFrame(1, new Vector3(300, 50, 0)); 
     animation.Duration = TimeSpan.FromSeconds(3); 
     animation.IterationBehavior = AnimationIterationBehavior.Forever; 

     MyVisual.StartAnimation(nameof(MyVisual.Offset), animation); 
    } 

    private async void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Position when animation running: " + MyVisual.Offset); 

     MyVisual.StopAnimation(nameof(MyVisual.Offset)); 

     await Task.Delay(10); 

     System.Diagnostics.Debug.WriteLine("Position when animation stopped: " + MyVisual.Offset); 
    } 
} 

答えて

0

これを解決するには、CompositionScopedBatchを使用できます。あなたが反復回数が無限であれば、ただちにCompletedイベントがトリガされることに注意してください(理由はわかりません)。ここにサンプルがあります:

public sealed partial class MainPage : Page 
{ 
    SpriteVisual MyVisual; 
    CompositionScopedBatch ScopedBatch; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     PointerReleased += MainPage_PointerReleased; 
    } 

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

     var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; 

     MyVisual = compositor.CreateSpriteVisual(); 

     MyVisual.Size = new Vector2(80, 80); 
     MyVisual.Offset = new Vector3(50, 50, 0); 
     MyVisual.Brush = compositor.CreateColorBrush(Colors.Green); 

     ElementCompositionPreview.SetElementChildVisual(this, MyVisual); 

     ScopedBatch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); 

     var animation = compositor.CreateVector3KeyFrameAnimation(); 
     animation.InsertKeyFrame(1, new Vector3(300, 50, 0)); 
     animation.Duration = TimeSpan.FromSeconds(3); 
     // animation.IterationBehavior = AnimationIterationBehavior.Forever; 
     // CompositionScopedBatch.Completed is triggered immediately if Infinite is used. 
     // Use many iterations instead. 
     animation.IterationBehavior = AnimationIterationBehavior.Count; 
     animation.IterationCount = 1000000; 

     MyVisual.StartAnimation(nameof(MyVisual.Offset), animation); 

     ScopedBatch.Completed += CompositionScopedBatch_Completed; 

     ScopedBatch.End(); 
    } 

    private void CompositionScopedBatch_Completed(object sender, CompositionBatchCompletedEventArgs args) 
    { 
     System.Diagnostics.Debug.WriteLine("Position when batch completed: " + MyVisual.Offset); 
    } 

    private void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Position when animation running: " + MyVisual.Offset); 

     MyVisual.StopAnimation(nameof(MyVisual.Offset)); 
    } 
} 
関連する問題