Обновление 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);
}));