使用调度程序更新WPF模型

时间:2013-03-18 23:49:14

标签: wpf dispatcher modelvisual3d

我有一个从文件加载的Visual3D对象并在屏幕上显示。这很好。我试图从SerialDataReceivedEventHandler中收到的数据中旋转它 - 这也可以正常工作。

当我尝试旋转模型时,它会抛出InvalidOperationException,因为该线程不拥有该对象。这就是我所拥有的:

QuaternionRotation3D rotation = new QuaternionRotation3D(q);
model.Dispatcher.BeginInvoke(new Action(() => 
           model.Transform = new RotateTransform3D(rotation)));

我知道我需要使用调度员,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:2)

我假设您发布的所有代码都在另一个线程中调用,因此您无法在该线程上创建QuaternionRotation3D,有几种方法可以解决这个问题,但是没有看到其余的代码难以猜测,但其中一个选项应该有效。

Application.Current.Dispatcher.BeginInvoke(new Action(() => 
{
    QuaternionRotation3D rotation = new QuaternionRotation3D(q);
    model.Transform = new RotateTransform3D(rotation);
}));

或者只是在MainWindow

Dispatcher.BeginInvoke(new Action(() => 
{
    QuaternionRotation3D rotation = new QuaternionRotation3D(q);
    model.Transform = new RotateTransform3D(rotation);
}));

或者model是否为线程安全(没有Observables / dependancy属性)

model.Dispatcher.BeginInvoke(new Action(() => 
{
    QuaternionRotation3D rotation = new QuaternionRotation3D(q);
    model.Transform = new RotateTransform3D(rotation);
}));