Angelo L
Вы должны использовать свойство Visibility для отображения и скрытия элемента управления. Тем не менее, у вас была правильная идея пойти на EventTrigger. Используйте ObjectAnimationUsingKeyFrames для свойства Visibility. Через 2 секунды текстовый блок свернется (станет скрытым), а через 3 секунды снова станет видимым.
<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>
Для случайного позиционирования TextBlock имеет событие IsVisibleChanged, которое вы можете использовать. Я добавил этот код C# к этому событию. Событие будет срабатывать каждый раз, когда раскадровка изменяет видимость. Обратите внимание, что я не стал утруждать себя обновлением позиции в отдельном потоке. Это происходит потому, что когда раскадровка снова меняет видимость, элемент управления должен быть повторно визуализирован, и в этом случае используются новые значения позиции.
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;
// mygrid is the name of the container my TextBlock is in
double GridHeight = myGrid.ActualHeight;
double GridWidth = myGrid.ActualWidth;
// only update postion when the control is collapsed
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;
}