Как добавить масштабную анимацию в загрузку пользовательских элементов управления - PullRequest
1 голос
/ 12 марта 2012

Я хочу добавить анимацию к загрузке пользовательских элементов управления в StackPanel.

Итак, я добавляю эти строки в существующий проект:

control.Loaded += UserControlLoaded;

и

    public void UserControlLoaded(object sender, System.Windows.RoutedEventArgs e)
    {
        UserControl control = (UserControl)sender;

        DoubleAnimation fadeInAnimation = new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(5)));
        Storyboard.SetTarget(fadeInAnimation, control);
        Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
        Storyboard sb = new Storyboard();
        sb.Children.Add(fadeInAnimation);
        sb.Begin();
    }

Это работает хорошо, но я хочу изменить его, чтобы масштабировать пользовательский элемент управления по обеим осям от 0 до 1 в течение 2 секунд, но я не могу найти код для установки целевого свойства раскадровки для осей X и Y LayoutTransform !

Преобразование было сделано в MS Blend следующим образом:

Как я могу сделать это программно.

Заранее благодарим за внимание.

1 Ответ

3 голосов
/ 12 марта 2012

Код, который должен анимировать LayoutTransform элемента управления, зависит от типа используемого преобразования. При условии, что это просто ScaleTransform, вы можете написать это:

FrameworkElement control = sender as FrameworkElement;
ScaleTransform transform = control.LayoutTransform as ScaleTransform;
DoubleAnimation scaleAnimation =
    new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(2)));

transform.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnimation);
transform.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimation);

Когда LayoutTransform был создан с помощью Blend, это, безусловно, не просто ScaleTransform, но TransformGroup с ScaleTransform в качестве первого потомка. Затем вы должны получить ScaleTranform примерно так:

TransformGroup transformGroup = control.LayoutTransform as TransformGroup;
ScaleTransform transform = transformGroup.Children[0] as ScaleTransform;

И снова я забыл причину, почему анимация трансформации, подобной этой, не будет работать с помощью раскадровки. Вместо прямого вызова BeginAnimation для объекта ScaleTransform, я попробовал приведенный ниже код, но безуспешно.

DoubleAnimation xScaleAnimation =
    new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(2)));
Storyboard.SetTarget(xScaleAnimation, transform);
Storyboard.SetTargetProperty(xScaleAnimation,
    new PropertyPath(ScaleTransform.ScaleXProperty));

DoubleAnimation yScaleAnimation =
    new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(2)));
Storyboard.SetTarget(yScaleAnimation, transform);
Storyboard.SetTargetProperty(yScaleAnimation,
    new PropertyPath(ScaleTransform.ScaleYProperty));

Storyboard sb = new Storyboard();
sb.Children.Add(xScaleAnimation);
sb.Children.Add(yScaleAnimation);
sb.Begin();
...