设置计时器功能UWP C#的持续时间

时间:2018-08-07 09:43:44

标签: c# timer uwp windows-10-universal dispatchertimer

我有一个应用程序,可以通过地图控件上的指定位置移动汽车。我正在使用下面的代码来实现此功能。但是现在我想为此设置一个持续时间。我的意思是,汽车应该在从起点到终点的特定时间到达。我该怎么做。我将持续时间传递给计时器,如代码所示。

class WrappedFunction(object):

    def __call__(self, func):
        def wrapper(*args, **kwargs):
            print(args)
            print(kwargs)
            # NOTE: `WrappedFunction` instance is available in `self`
        return wrapper

class Foo:
    @WrappedFunction()  # wrap directly, without an intermediary
    def mem_fun(self, msg):
        pass

foo = Foo()
foo.mem_fun('hi')
# (<__main__.Foo object at 0x000001A2216CDBA8>, 'hi')
# {}

但是现在发生的情况是汽车到达时间比持续时间快,并且在 public class PathAnimation { private const int _delay = 30; private DispatcherTimer _timerId; private int? _duration; private int _frameIdx = 0; private bool _isPaused; private DateTime _timerStart = DateTime.Now; public PathAnimation(IntervalCallback intervalCallback,int? duration) { _duration = duration; _timerId = new DispatcherTimer(); _timerId.Interval = new TimeSpan(0, 0, 0, 0, _delay); _timerId.Tick += (s, a) => { if (!_isPaused) { if (intervalCallback != null) { intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx); } if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value) { _timerId.Stop(); } _frameIdx++; } }; } public delegate void IntervalCallback(BasicGeoposition loc, int pathIdx, int frameIdx); public void Play() { _timerStart = DateTime.Now; _frameIdx = 0; _isPaused = false; _timerId.Start(); } public void Pause() { _isPaused = true; } public void Stop() { if (_timerId.IsEnabled) { _frameIdx = 0; _isPaused = false; _timerId.Stop(); } } } 上导致索引不足错误

1 个答案:

答案 0 :(得分:0)

  

但是现在发生的情况是汽车到达时间比持续时间快,并导致索引错误...

我不确定您在这里的逻辑,但为避免得到IndexOutOfRangeException,应确保集合的Count始终大于传递给索引器的值,例如:

_timerId.Tick += (s, a) =>
{
    if (!_isPaused)
    {
        if (intervalCallback != null 
            && AppGlobals._intervalLocs.Count > _frameIdx
            && AppGlobals._intervalIdx.Count > _frameIdx)
        {
            intervalCallback(AppGlobals._intervalLocs[_frameIdx], AppGlobals._intervalIdx[_frameIdx], _frameIdx);
        }

        _frameIdx++;

        if ((DateTime.Now - _timerStart).TotalMilliseconds >= _duration.Value)
            _timerId.Stop();
    }
};