Обновление WPF-модели с помощью диспетчера

У меня есть объект Visual3D, загруженный из файла и отображаемый на экране. Это отлично работает. Я пытаюсь повернуть его из данных, полученных в SerialDataReceivedEventHandler - который также работает нормально.

Когда я пытаюсь повернуть модель, она генерирует исключение InvalidOperationException, поскольку поток не владеет объектом. Вот что у меня есть:

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

Я знаю, что мне нужно использовать диспетчер, но я не могу понять, как.

1 ответ

Решение

Я предполагаю, что весь размещенный вами код вызывается из другого потока, поэтому вы не сможете создать 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/ зависимость)

model.Dispatcher.BeginInvoke(new Action(() => 
{
    QuaternionRotation3D rotation = new QuaternionRotation3D(q);
    model.Transform = new RotateTransform3D(rotation);
}));
Другие вопросы по тегам