Продолжается ли анимация раскадровки WPF, когда уязвимый элемент управления скрыт? - PullRequest
3 голосов
/ 25 февраля 2010

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

Ответы [ 2 ]

5 голосов
/ 25 февраля 2010

Нет. 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);
        }
    }
}

Вы заметите доказательство блеска WPF в выходных данных отладки: он показывает DoubleProperty изменения независимо от того, видим контроль или нет, но видимость имеет значение, когда дело доходит до измерения / размещения. Обработчики не вызываются, когда свернут элемент управления, хотя я отметил DoubleProperty как свойство, которое влияет на meausre иrange ...

0 голосов
/ 25 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...