Выполнять обновления пользовательского интерфейса в цикле - PullRequest
1 голос
/ 24 марта 2011

Я работаю над пользовательским интерфейсом мобильного приложения, имеющего панель с импульсом (для плавной прокрутки), и в настоящее время обновляю пользовательский интерфейс во время плавной прокрутки, используя следующий код:

private void scrollKinetic()
{
    while (_curState == States.KineticScroll)
    {
        //  This gets how far the panel will move with the current velocity, then updates the velocity according to the current friction.
        var distY = GetDistance(scrVelocity.Y);
        var distX = GetDistance(scrVelocity.X);

        if (distY + distX <= 0)  //  Friction will eventually make distX and distY both 0
        {
            _curState = States.Idle;
            Invalidate();
            break;
        }

        //  CalculatePosition will move the panel accordingly.

        CalculatePosition(distY, scrVelocity.Y, false);
        CalculatePosition(distX, scrVelocity.X, true);

        Invalidate();
        friction++;
        Application.DoEvents();
    }
}

Как видите, Application.DoEvents(); поднимает свою уродливую голову! Я хочу избавиться от этого, но я не могу придумать способ зациклить и обновить пользовательский интерфейс. Любая помощь / идеи будут превосходны!

Я делаю это на .net CF, но я думаю, что это проблема дизайна, поэтому я не думаю, что платформа будет иметь слишком большое значение.

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Вы можете попытаться удалить цикл (и все вызовы App.DoEvent), сделать вызов KineticScroll в своем методе OnPaint (), а затем вызвать Invalidate () в своем методе KineticScroll.

Я вижу, что у вас есть какое-то отслеживание состояния, поэтому вы можете сказать что-то вроде:

if(_curState == States.KineticScroll)
    KineticScroll();

в вашем методе OnPaint (), поэтому вы вызываете его только тогда, когда ваше состояние приближается.

По сути, ваш цикл переходит от локального цикла while к: OnPaint -> KineticScroll -> Invalidate -> OnPaint...etc таким образом, вы получаете тот же цикл без вызова DoEvents!

1 голос
/ 24 марта 2011

Я бы создал таймер, который действовал бы как «игровой цикл» - выполнялся бы x раз в секунду.
Я бы также отслеживал, сколько времени прошло с момента последнего вызова, чтобы вы могли вычислить, сколькодвигаться на основе прошедшего времени.Для дополнительной производительности таймер можно запускать и останавливать только при наличии движения.

В зависимости от того, какой таймер вы используете, вам может потребоваться перенаправить вызовы обновления вашего пользовательского интерфейса обратно в поток пользовательского интерфейса.

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