Search code examples
wpfdispatchermodelvisual3d

Updating WPF Model using dispatcher


I have a Visual3D object loaded from a file and displaying on screen. That works fine. I am trying to rotate it from data received in a SerialDataReceivedEventHandler - which also works fine.

When I try to rotate the model, it throws an InvalidOperationException because the thread doesn't own the object. Here's what I have:

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

I know I need to use the dispatcher, but I can't figure out how.


Solution

  • I assume all the code you posted is called inside another thread, so you wont be able to create the QuaternionRotation3D on that thread, There are a few ways to solve this but without seeing the rest of your code its hard to guess but one of these options should work.

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

    Or if its just on the MainWindow

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

    Or if model is threadsafe (no Observables/dependancy properties)

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