Вы предполагаете, что событие Rendering происходит с постоянной скоростью? Это не гарантировано. На моей машине он обычно срабатывает 60 раз в секунду, но иногда он немного быстрее, а иногда заметно медленнее. Кажется, что иногда пропускается кадр, что может привести к тому, что ваша анимация не будет плавной.
Однако событие дает вам информацию, чтобы точно определить, сколько времени прошло с момента последнего кадра (хотя вы должны знать, как его получить), и вы можете написать свою анимацию, чтобы принять это во внимание. Двигайтесь дальше, если с последнего кадра прошло больше времени и т. Д.
Вам необходимо взять EventArgs, переданный в ваш обработчик событий, привести его к RenderingEventArgs , а затем прочитать его RenderingTime свойство. Рассчитайте дельту в RenderingTime с момента вашего последнего события; это говорит вам, сколько времени прошло с тех пор, как был показан ваш последний кадр, и вы можете использовать его для изменения темпа анимации.
CompositionTarget.Rendering += CompositionTarget_Rendering;
...
private static TimeSpan? _lastRenderTime;
private void CompositionTarget_Rendering(object sender, EventArgs e) {
var args = (RenderingEventArgs) e;
var elapsed = _lastRenderTime.HasValue ?
args.RenderingTime - _lastRenderTime.Value :
TimeSpan.Empty;
_lastRenderTime = args.RenderingTime;
// "elapsed" tells you how long since the last frame.
// Now you can update your animation accordingly. For example,
var left = Canvas.GetLeft(_myControl);
left += elapsed.TotalSeconds * 100;
Canvas.SetLeft(_myControl, left);
}
Я слышал, что, по крайней мере в WPF, RenderTime не сообщает вам текущее время, а, скорее, сколько времени будет, когда на экране будет показан кадр. Я не видел этого в официальных источниках, и даже если это правда, я не знаю, верно ли это и для Silverlight. Но в любом случае это даст вам наилучшую информацию для написания анимации.