You should use the Visibility property to show and hide the control. That said, you had the right idea going for the EventTrigger. Use ObjectAnimationUsingKeyFrames for the Visibility property. After 2 seconds the TextBlock will collapse (become hidden), then 3 seconds later it will become visible again.
<TextBlock.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetProperty="Visibility"
RepeatBehavoir="Forever">
<DiscreteObjectKeyFrame KeyTime="0:0:2"
Value="{x:Static Visibility.Collapsed}"/>
<DiscreteObjectKeyFrame KeyTime="0:0:5"
Value="{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
For the random positioning TextBlock has an IsVisibleChanged event that you can use. I added this C# code to that event. The event will trigger every time the storyboard changes the Visiblity. Note that I didn't bother updating the position in a separate thread. This is because when the storyboard changes the Visibility again the control has to be re-rendered and the new position values are used when that happens.
private void UpdatePostion(object sender, DependencyPropertyChangedEventArgs e)
{
FrameworkElement tb = (FrameworkElement)sender;
Random rnd = new Random();
double tbHeight = tb.Height;
double tbWidth = tb.width;
Thickness tbMargin = tb.Margin;
double GridHeight = myGrid.ActualHeight;
double GridWidth = myGrid.ActualWidth;
if (tb.Visibility != Visibility.Collapsed)
return;
tbMargin.Top = (double)(rnd.Next(0, (int)(GridHeight - tbHeight)));
tbMargin.Width = (double)(rnd.Next(0, (int)(GridWidth - tbWidth)));
tb.Margin = tbMargin;
}