2010-02-25 7 views
3

J'implémente une animation de style "fourmis marching" en appliquant une animation StrokeDashOffset à un contrôle Rectangle. Je voudrais que l'animation soit lue lorsque le rectangle est visible mais ne prenne pas de cycles CPU supplémentaires quand il est caché. WPF est-il assez intelligent pour mettre automatiquement en pause l'animation lorsque le contrôle affecté est caché?Une animation de storyboard WPF continue-t-elle à s'exécuter lorsque le contrôle affecté est masqué?

Répondre

5

Non WPF est assez intelligent pour ne pas le faire :). La raison derrière cela est que vous ne pouvez pas prédire ce que fait la propriété animée (il peut s'agir de toute propriété de dépendance, pas nécessairement liée à l'apparence du contrôle).

Vous pouvez effectuer le test suivant.

XAML:

<Window x:Class="WpfApplication1.TestBrowser" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     Title="Animation Test" 
     Height="300" 
     Width="300"> 
    <StackPanel> 
      <Button Content="Toggle label" 
          Click="ToggleLableClick"/> 
      <local:MyLabel x:Name="lbl" Content="Hello" /> 
    </StackPanel> 
</Window> 

C#:

using System; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media.Animation; 

namespace WpfApplication1 
{ 
    public partial class TestBrowser : Window 
    { 
    public TestBrowser() 
    { 
     InitializeComponent(); 
     var da = new DoubleAnimation(0, 10, new Duration(TimeSpan.FromSeconds(10))) 
        { 
         AutoReverse = true, 
         RepeatBehavior = RepeatBehavior.Forever 
        }; 
     lbl.BeginAnimation(MyLabel.DoublePropertyProperty, da); 
    } 

    private void ToggleLableClick(object sender, RoutedEventArgs e) 
    { 
     lbl.Visibility = lbl.IsVisible ? Visibility.Collapsed : Visibility.Visible; 
    } 
    } 

    public class MyLabel : Label 
    { 
     public double DoubleProperty 
     { 
      get { return (double)GetValue(DoublePropertyProperty); } 
      set { SetValue(DoublePropertyProperty, value); } 
     } 

     public static readonly DependencyProperty DoublePropertyProperty = 
       DependencyProperty.Register("DoubleProperty", typeof(double), typeof(MyLabel), 
       new FrameworkPropertyMetadata(0.0, 
        FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange, OnDoublePropertyChanged)); 

     private static void OnDoublePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Trace.WriteLine(e.NewValue); 
     } 

     protected override Size MeasureOverride(Size constraint) 
     { 
      Trace.WriteLine("Measure"); 
      return base.MeasureOverride(constraint); 
     } 

     protected override Size ArrangeOverride(Size arrangeBounds) 
     { 
      Trace.WriteLine("Arrange"); 
      return base.ArrangeOverride(arrangeBounds); 
     } 
    } 
} 

Vous remarquerez prouver de brillance WPF en sortie de débogage: il montre DoubleProperty changements ne contrôlent la matière visible ou non, mais la visibilité compte quand il s'agit de mesurer/organiser. Les gestionnaires ne sont pas appelés lorsque le contrôle est réduit, bien que j'ai marqué DoubleProperty en tant que propriété qui affecte le meausre et arrange ...

0

Je pense que l'animation continue, mais le système de rendu se rendra compte que le rectangle est invisible et ne perdra pas de temps à redessiner quoi que ce soit.

Il est possible d'animer les propriétés Visibilité ou Opacité, ce qui ne fonctionnerait pas si le système d'animation prenait en compte la visibilité.

Questions connexes