Как остановить первым, ЕСЛИ в тик таймера?

#c# #if-statement

#c# #if-оператор

Вопрос:

У меня есть изображение, которое должно идти до конца холста вправо, а после этого ему нужно вернуться и продолжать выполнять это как цикл. Проблема в том, что первое условие никогда не останавливается, поэтому после достижения Getleft оно продолжает работать, и изображение не может перейти влево.

 private void Timer_Tick(object sender, object e)
    {
        if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) <= 1920)
        {
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Collapsed;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Visible;
            x  = 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(), x);
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(), x);
        }
        else if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) >= 0)
        {
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Visible;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Collapsed;
            x -= 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(), x);
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(), x);
        }
    }
  

Ответ №1:

Это потому, что ваше первое условие установлено в <=1920 .

Итак, когда он в первый раз превысил 1920 и выполнил второе условие, он СНОВА стал меньше 1920!

Вот почему он всегда будет чередоваться между первым и вторым условием, когда x мерцает между 1920 и 1925 годами!

Попробуйте создать дополнительную глобальную переменную, обозначающую НАПРАВЛЕНИЕ изображения, а затем запустите инструкции if.

 private bool toRight=true;

private void Timer_Tick(object sender, object e)
{
    if(toRight)
    {
        if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) <= 1920)
        {
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Collapsed;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Visible;
            x  = 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(),x);  
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(),x);
        }
        else
        {
            toRight=false;
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Visible;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Collapsed;
            x -= 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(), x);
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(), x);
        }
    }
    else
    {
        if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) >= 0)
        {
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Visible;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Collapsed;
            x -= 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(), x);
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(), x);
        }
        else
        {
            toRight=true;
            double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
            _wolves.WolvesLeftAvatar().Visibility = Visibility.Collapsed;
            _wolves.WolvesRightAvatar().Visibility = Visibility.Visible;
            x  = 5;
            Canvas.SetLeft(_wolves.WolvesRightAvatar(),x);    
            Canvas.SetLeft(_wolves.WolvesLeftAvatar(),x);
        }
    }
}
  

Еще лучше, вы могли бы сделать перемещение изображения методом и вызвать его.

 private bool toRight=true;

private void MoveX(int m)
{
    double x = Canvas.GetLeft(_wolves.WolvesLeftAvatar());
    if(m>0)
    {
        _wolves.WolvesLeftAvatar().Visibility = Visibility.Collapsed;
        _wolves.WolvesRightAvatar().Visibility = Visibility.Visible;
    }
    else
    {
        _wolves.WolvesLeftAvatar().Visibility = Visibility.Visible;
        _wolves.WolvesRightAvatar().Visibility = Visibility.Collapsed;
    }
    x  = m;
    Canvas.SetLeft(_wolves.WolvesRightAvatar(),x);    
    Canvas.SetLeft(_wolves.WolvesLeftAvatar(),x);
}

private void Timer_Tick(object sender, object e)
{
    if(toRight)
    {
        if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) <= 1920)
        {
            MoveX(5);
        }
        else
        {
            toRight=false;
            MoveX(-5);
        }
    }
    else
    {
        if (Canvas.GetLeft(_wolves.WolvesLeftAvatar()) >= 0)
        {
            MoveX(-5);
        }
        else
        {
            toRight=true;
            MoveX(5);
        }
    }
}
  

Комментарии:

1. Большое вам спасибо! Я так много дней работал над этим! Я новичок в кодировании! Послушайте, первый код у меня не сработал, и я не уверен почему, но метод сработал идеально!

2. Рад, что могу помочь! Отладчик — отличный инструмент! Вы можете запустить его построчно, и вы увидите, что x мигает между 1920 и 1925 годами. Узнайте, как его использовать, и это окажет вам большую помощь! Удачи!!!