Reputation:
I want to rotate as well as enlarge and then shrink a TextBlock. I want to use Stroyboard and write the code in code-behind file.
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1">
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Name="rotatingTextBlock" Text="Hello" RenderTransformOrigin="0.5, 0.5"/>
<TextBlock Text=" World!"/>
</StackPanel>
</Grid>
</Window>
..
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
TransformGroup tc = new TransformGroup();
RotateTransform rotateTransform = new RotateTransform();
tc.Children.Add(rotateTransform);
ScaleTransform scaleTransform = new ScaleTransform();
tc.Children.Add(scaleTransform);
rotatingTextBlock.RenderTransform = tc;
Storyboard storyboard = new Storyboard();
DoubleAnimation rotateAnimation = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(2)));
rotateAnimation.AccelerationRatio = 0.15;
rotateAnimation.DecelerationRatio = 0.15;
Storyboard.SetTarget(rotateAnimation, rotateTransform);
Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath(RotateTransform.AngleProperty));
storyboard.Children.Add(rotateAnimation);
DoubleAnimation scaleAnimation = new DoubleAnimation(1, 1.2, new Duration(TimeSpan.FromSeconds(1)));
scaleAnimation.AccelerationRatio = 0.5;
scaleAnimation.DecelerationRatio = 0.5;
scaleAnimation.AutoReverse = true;
Storyboard.SetTarget(scaleAnimation, scaleTransform);
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(ScaleTransform.ScaleXProperty));
storyboard.Children.Add(scaleAnimation);
storyboard.Begin();
}
My code doesn't work. Am I missing something?
Upvotes: 0
Views: 639
Reputation: 5208
The following works:
Storyboard storyboard = new Storyboard();
DoubleAnimation rotateAnimation = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(2)));
rotateAnimation.AccelerationRatio = 0.15;
rotateAnimation.DecelerationRatio = 0.15;
try { UnregisterName("rotateTransform"); }
catch { }
finally { RegisterName("rotateTransform", rotateTransform); }
Storyboard.SetTargetName(rotateAnimation, "rotateTransform");
Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath(RotateTransform.AngleProperty));
storyboard.Children.Add(rotateAnimation);
DoubleAnimation scaleAnimation = new DoubleAnimation(1, 1.2, new Duration(TimeSpan.FromSeconds(1)));
scaleAnimation.AccelerationRatio = 0.5;
scaleAnimation.DecelerationRatio = 0.5;
scaleAnimation.AutoReverse = true;
try { UnregisterName("scaleTransform"); }
catch { }
finally { RegisterName("scaleTransform", scaleTransform); }
Storyboard.SetTargetName(scaleAnimation, "scaleTransform");
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath(ScaleTransform.ScaleXProperty));
storyboard.Children.Add(scaleAnimation);
storyboard.Begin(this);
However, I tried LPL's solution and that also works - and if LPL's method would work for any "abstract" target, then I think I much prefer it as a solution (to save registering names, etc.). (The problem is I have no idea how to put together those property paths!)
Upvotes: 1
Reputation: 17063
According to Storyboard.SetTarget only works on UIElements, but throws no exception it seems that you can not target a Transform
directly. If you target the TextBlock
with the right PropertyPath
it works:
Storyboard storyboard = new Storyboard();
DoubleAnimation rotateAnimation = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(2)));
rotateAnimation.AccelerationRatio = 0.15;
rotateAnimation.DecelerationRatio = 0.15;
Storyboard.SetTarget(rotateAnimation, rotatingTextBlock);
Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath("RenderTransform.Children[0].(RotateTransform.Angle)"));
storyboard.Children.Add(rotateAnimation);
DoubleAnimation scaleAnimation = new DoubleAnimation(1, 1.2, new Duration(TimeSpan.FromSeconds(1)));
scaleAnimation.AccelerationRatio = 0.5;
scaleAnimation.DecelerationRatio = 0.5;
scaleAnimation.AutoReverse = true;
Storyboard.SetTarget(scaleAnimation, rotatingTextBlock);
Storyboard.SetTargetProperty(scaleAnimation, new PropertyPath("RenderTransform.Children[1].(ScaleTransform.ScaleX)"));
storyboard.Children.Add(scaleAnimation);
Upvotes: 2