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é?
Une animation de storyboard WPF continue-t-elle à s'exécuter lorsque le contrôle affecté est masqué?
Répondre
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 ...
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é.