在我的WPF应用程序中,用户按下一个按钮来平稳地启动3D模型,然后松开按钮停止旋转。
为此,我创建了一个DispatcherTimer:
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );当按下按钮时,我调用timer.Start(),当按钮松开时,我调用timer.Stop()。
timer_Tick函数改变了模型的旋转:
void timer_Tick( object sender, EventArgs e )
{
spin = ( spin + 2 ) % 360;
AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
Transform3D rotate = new RotateTransform3D( rotation );
model2.Transform = rotate;
}我注意到的是,模型在大多数情况下旋转平稳,但经常结冰和口吃,停顿不同的时间,有时长达1/4秒。
有什么办法让这件事更顺利吗?我理解,通过使用DispatcherTimer (相对于System.Timers.Timer),回调发生在UI线程上。但我有必要加入UI威胁才能运行
model2.Transform = rotate;我读过关于在其他线程上获得计时器回调的各种方法。但似乎最后我必须与UI线程同步才能调用该行。如果我使用Invoke()来封送System.Timers.Timer回调线程到UI线程,这会给整个动画带来更流畅的效果吗?似乎不应该这样做,因为它必须与UI线程同步,就像DispatcherTimer所做的那样。就这一点而言,似乎任何将model2.Transform设置为一个规则间隔的方案对于UI线程来说都是在同一条船上,不是吗?
(作为一个次要的问题,我首先想弄清楚是什么导致了停顿。据我所知,UI线程没有做任何其他重要的事情。所以我不明白停下来的时候发生了什么。垃圾收集?它似乎不应该有很多垃圾收集,它似乎不会是如此极端的暂停。)
发布于 2013-01-16 09:37:51
设置一个优先级。默认的是Background,这可能解释您所看到的口吃。我认为Render是你想要的水平,但做实验。
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Render);如果这还不够顺利,你可以尝试把它设置为动画。
https://stackoverflow.com/questions/14354561
复制相似问题