2014-12-16 2 views
3

Мне нужно масштабировать EllipseGeometry в C# с помощью ScaleTransform, но это не работает. Вот код:WPF - анимация EllipseGeometry в C# с использованием раскадровки

XAML:

<Image x:Name="rock" Stretch="None"> 
    <Image.Clip> 
     <EllipseGeometry x:Name="rockClip" RadiusX="100" RadiusY="100" Center="200,150"> 
      <EllipseGeometry.Transform> 
        <ScaleTransform/> 
      </EllipseGeometry.Transform> 
     </EllipseGeometry> 
    </Image.Clip> 
</Image> 

C#:

DoubleAnimation scaleX = new DoubleAnimation(); 
scaleX.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
scaleX.Duration = new Duration(TimeSpan.FromMilliseconds(2000)); 
scaleX.From = 0.0; 
scaleX.To = 1.0; 
scaleX.SetValue(Storyboard.TargetProperty, rockClip); 
scaleX.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(EllipseGeometry.Transform).(ScaleTransform.ScaleX)")); 

DoubleAnimation scaleY = new DoubleAnimation(); 
scaleY.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
scaleY.Duration = new Duration(TimeSpan.FromMilliseconds(2000)); 
scaleY.From = 0.0; 
scaleY.To = 1.0; 
scaleY.SetValue(Storyboard.TargetProperty, rockClip); 
scaleY.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(EllipseGeometry.Transform).(ScaleTransform.ScaleY)")); 

Storyboard storyboard = new Storyboard(); 
storyboard.Children.Add(scaleX); 
storyboard.Children.Add(scaleY); 
storyboard.Completed += storyboard_Completed; 
animation.Begin(); 

Событие storyboard_Completed срабатывает, но там нет анимации на EllipseGeometry.

Где проблема?

Я могу оживить EllipseGeometry только таким образом:

DoubleAnimation scale = new DoubleAnimation(); 
scale.From = 0; 
scale.To = 40; 
scale.Duration = new Duration(TimeSpan.FromMilliseconds(5000)); 
rockClip.BeginAnimation(EllipseGeometry.RadiusXProperty, scale); 
rockClip.BeginAnimation(EllipseGeometry.RadiusYProperty, scale); 

мне нужно поставить этот DoubleAnimation в раскадровке, но я не знаю, как.

Спасибо.

ответ

2

Это работает, если вы используете элемент управления Image (вместо геометрии) в качестве целевого элемента:

var scaleX = new DoubleAnimation(); 
scaleX.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
scaleX.Duration = TimeSpan.FromSeconds(2); 
scaleX.From = 0.0; 
scaleX.To = 1.0; 
Storyboard.SetTarget(scaleX, rock); 
Storyboard.SetTargetProperty(scaleX, new PropertyPath("Clip.Transform.ScaleX")); 

var scaleY = new DoubleAnimation(); 
scaleY.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
scaleY.Duration = TimeSpan.FromSeconds(2); 
scaleY.From = 0.0; 
scaleY.To = 1.0; 
Storyboard.SetTarget(scaleY, rock); 
Storyboard.SetTargetProperty(scaleY, new PropertyPath("Clip.Transform.ScaleY")); 

var storyboard = new Storyboard(); 
storyboard.Children.Add(scaleX); 
storyboard.Children.Add(scaleY); 
storyboard.Begin(); 

Однако наиболее просто способ может быть, чтобы назвать ScaleTransform

<EllipseGeometry.Transform> 
    <ScaleTransform x:Name="scale"/> 
</EllipseGeometry.Transform> 

и выполните такие анимации:

var scaleAnimation = new DoubleAnimation 
{ 
    BeginTime = TimeSpan.FromMilliseconds(fromMills), 
    Duration = TimeSpan.FromSeconds(2), 
    From = 0.0, 
    To = 1.0 
}; 

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

EDIT: Для того, чтобы оживить RadiusX и RadiusY свойства с помощью раскадровки, вы могли бы написать это:

var radiusXAnimation = new DoubleAnimation(); 
radiusXAnimation.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
radiusXAnimation.Duration = TimeSpan.FromSeconds(2); 
radiusXAnimation.From = 0; 
radiusXAnimation.To = 100; 
Storyboard.SetTarget(radiusXAnimation, rock); 
Storyboard.SetTargetProperty(radiusXAnimation, new PropertyPath("Clip.RadiusX")); 

var radiusYAnimation = new DoubleAnimation(); 
radiusYAnimation.BeginTime = TimeSpan.FromMilliseconds(fromMills); 
radiusYAnimation.Duration = TimeSpan.FromSeconds(2); 
radiusYAnimation.From = 0; 
radiusYAnimation.To = 100; 
Storyboard.SetTarget(radiusYAnimation, rock); 
Storyboard.SetTargetProperty(radiusYAnimation, new PropertyPath("Clip.RadiusY")); 

var storyboard = new Storyboard(); 
storyboard.Children.Add(radiusXAnimation); 
storyboard.Children.Add(radiusYAnimation); 
storyboard.Begin(); 
+0

Thanks Клеменс, он работает с помощью элемента управления изображения в качестве цели. Как я могу изменить начало преобразования рендера? Я попытался с помощью < ', но он не работает. Итак, я изменил CenterX/Y '', таким образом анимация заканчивается правильно (в середине изображения 400x300), но начинается в левом верхнем углу изображения (а не посередине). Как изменить начало преобразования рендеринга (возможно, используя значения 0..1)? Спасибо за вашу помощь. – Andrea

+0

Непонятно, чего именно вы хотите достичь. Сначала вы не анимируете RenderTransform, а трансформируете геометрию клипа. Если вы хотите сохранить центр геометрии клипа, вы не должны анимировать преобразование геометрии, а вместо этого оживите его RadiusX и RadiusY (как вы уже это сделали). – Clemens

+0

Да, я хочу сохранить центр геометрии клипа. С 'RockClip.BeginAnimation (EllipseGeometry.RadiusXProperty, scale)' он отлично работает, но я не знаю, как разместить эту анимацию внутри раскадровки. Как я могу это достичь? Благодаря! – Andrea