Как остановить первый IF в таймере таймера? - PullRequest
1 голос
/ 11 марта 2019

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

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 Ответ

0 голосов
/ 11 марта 2019

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

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

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

Попробуйте создать дополнительную глобальную переменную, обозначающую DIRECTION изображения, а затем запустите операторы 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...