Vijayakumara Nv Ответов: 2

Показать / Скрыть текстовый блок в окне WPF в течение некоторого фиксированного интервала времени и в случайном положении


Привет. я сталкиваюсь с проблемой в достижении следующих вещей с помощью WPF, XAML / c# -
1. нужно скрыть текстовый блок на 3 секунды и показать его на 2 секунды в окне
2. его положение должно быть случайным каждый раз, когда он появляется в окне.
Пожалуйста, помогите мне..

Что я уже пробовал:

Я пробовал следовать, но это дает желаемый результат -

<TextBlock Foreground="Red" Text="Some Information">
	<TextBlock.Triggers>
		<EventTrigger  RoutedEvent="Window.Loaded">
			<BeginStoryboard>
				<Storyboard>
					<DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)"
						From="1" 
						To="0" 
						AutoReverse="True"
						BeginTime="0:0:0" 
						Duration="0:0:.125"
						RepeatBehavior="Forever">
					</DoubleAnimation>
				</Storyboard>
			</BeginStoryboard>
		</EventTrigger>
	</TextBlock.Triggers>
</TextBlock>

2 Ответов

Рейтинг:
2

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;
}


Рейтинг:
12

Mahesh Alappuzha

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Timer tmr;
        public MainWindow ( )
        {
            InitializeComponent ( );
            tmr = new Timer {Interval = 3*1000};
            tmr.Elapsed +=tmr_Elapsed;
            tmr.Start ( );
        }

        private void tmr_Elapsed (object sender , ElapsedEventArgs e)
        {
            Application.Current.Dispatcher.Invoke ( GetValue );
        }

        private void GetValue()
        {
            if (tmr.Interval == 3*1000)
            {
                txtSample.Visibility = Visibility.Collapsed;
                tmr.Interval = 2*1000;
            }
            else
            {
                txtSample.Visibility = Visibility.Visible;
                tmr.Interval = 3*1000;
            }
        }
    }
}