Как изменить картинку с помощью таймера - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь изменить изображение за 2 секунды.Это должно быть только один раз, а не беспроигрышно.

Я погуглил всевозможные альтернативы, но не смог его найти.Как thread.sleep (2000) не работает, потому что он замораживает интерфейс.

public partial class Window1 : Window
{
    private static System.Timers.Timer aTimer;

public void RemoveImage()
    {
        Image.Source = new BitmapImage(new Uri("path to image 2"));
        SetTimer();            
    }

private void SetTimer()
    {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

private void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Image.Source = new BitmapImage(new Uri("path to image 3"));
    }

XAML-код

<Window

<Image Source="path to image 1" Grid.Row="1" Grid.Column="8" 
Name="Image" Stretch="None" HorizontalAlignment="Center" 
VerticalAlignment="Center"></Image>

</Grid>
</Window>

С этим кодом я получаю второе изображение, но оно естьДобравшись до последнего изображения, вы получите ошибку System.InvalidOperationException для изображения 3. Надеюсь, вы могли бы помочь мне с любым решением

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Не используйте Dispatcher.Invoke с System.Timers.Timer.

Вместо этого используйте DispatcherTimer, который уже вызывает свой обработчик Tick в потоке пользовательского интерфейса .:

private DispatcherTimer timer;

private void SetTimer()
{
    timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
    timer.Tick += OnTimerTick;
    timer.Start();
}

private void OnTimerTick(object sender, EventArgs e)
{
    Image.Source = new BitmapImage(new Uri("path to image 3"));
    timer.Stop();
}
0 голосов
/ 10 февраля 2019

Таймер не работает в потоке пользовательского интерфейса, поэтому вы не можете изменить элементы управления в OnTimedEvent без вызова Dispatcher.Invoke https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.invoke?view=netframework-4.7.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...