TextEffect can be used to apply transforms to parts of a TextBlock. TextEffect can also be animated to create "moving" text that can create some very unique effects. As pointed out by Filipe Fortes's blog article, note the following about TextEffect:
1) The transform effect is always relative to the beginning of the line. This had me confused when I started to use the TextEffect. I wanted to create an effect where an animation runs from the first character to the last and each character rotates and then fades away. What I then discovered, is that the character would actually do a rotate around the beginning of the line which looks weird!
2) Any size or layout changes will not affect the layout of the text. Once my first attempt at the rotate failed, I thought I would try and make each letter inflated and then deflate... This works cool but because the text layout is not affected, the inflated letter overlaps the other content! It also looks weird!
Well, now that we have all the negatives out of the way... how do I make my text move in a wave?
First off we need a TextBlock with some text in
<TextBlock x:Name="txtBlock" Text="WPF is very cool!!!" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="36" Loaded="txtBlock_Loaded" />
Next, use the OnLoaded event of the TextBlock to start the animation
Storyboard storyboard = new Storyboard();
storyboard.RepeatBehavior = RepeatBehavior.Forever;
storyboard.AutoReverse = true;
txtBlock.TextEffects = new TextEffectCollection();
for (int i = 0; i < txtBlock.Text.Length; i++)
{
TextEffect effect = new TextEffect();
effect.PositionCount = 1;
effect.PositionStart = i;
effect.Transform = new TranslateTransform();
txtBlock.TextEffects.Add(effect);
DoubleAnimation animation = new DoubleAnimation(0, 20, new Duration(TimeSpan.FromSeconds(1)));
animation.AccelerationRatio = 0.5;
animation.DecelerationRatio = 0.5;
animation.AutoReverse = true;
animation.RepeatBehavior = RepeatBehavior.Forever;
animation.BeginTime = TimeSpan.FromSeconds(i * 0.25);
Storyboard.SetTargetName(animation, "txtBlock");
string path = String.Format("TextEffects[{0}].Transform.Y",i);
PropertyPath propPath = new PropertyPath(path);
Storyboard.SetTargetProperty(animation, propPath);
storyboard.Children.Add(animation);
}
storyboard.Begin(this);
And the final animation looks something like this

You actually have to run the code to really see the animation... the screen capture just doesn't do it justice! This is a very basic example of how it can be used... Before venturing to far into the TextEffect, first see if a RenderTransform or LayoutTransform is not enough!!! I only found the TextEffect useful when I started working at a per character level!
Also have a look at Filipe Forte's article and Josh Smith also has a sample application he build (based on a sample from Chris Anderson's book)