2010-02-25 1 views
3

Я реализую анимацию стиля «марширующих муравьев», применяя анимацию StrokeDashOffset к элементу управления Rectangle. Я хотел бы, чтобы анимация воспроизводилась, когда прямоугольник виден, но не занимать лишние циклы процессора, когда он скрыт. Является ли WPF достаточно умным, чтобы автоматически приостанавливать анимацию, когда скрытый элемент управления скрыт?Разве анимация раскадровки WPF продолжает работать, когда скрытый элемент управления скрыт?

ответ

5

Нет. WPF достаточно умен, чтобы не делать этого :). Причина этого заключается в том, что вы не можете предсказать, что такое анимированное свойство (это может быть любое свойство зависимости, не связанное с внешним видом управления).

Вы можете выполнить следующее испытание.

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); 
     } 
    } 
} 

Вы заметите доказать МОФ блеска в отладочный вывод: он показывает DoubleProperty изменения независимо от того, управлять видимым или нет, но видимость имеет значение, когда дело доходит до Measure/Arrange. Обработчики не вызывают, когда управление рушится, хотя я обозначил DoubleProperty как свойство, которое влияет на meausre и организует ...

0

Я думаю, что анимация продолжается, но система рендеринга поймет, что прямоугольник невидим и не будет тратить время на перерисовку всего.

Можно анимировать свойства видимости или непрозрачности, которые не будут работать, если анимационная система учитывает видимость.

Смежные вопросы