0

Visual3Dオブジェクトをファイルからロードし、画面に表示しています。それはうまくいきます。SerialDataReceivedEventHandlerで受信したデータからローテーションしようとしています-これも正常に機能します。

モデルを回転させようとすると、スレッドがオブジェクトを所有していないため、InvalidOperationExceptionがスローされます。これが私が持っているものです:

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

コーディネーターを使用する必要があることはわかっていますが、その方法がわかりません。

4

1 に答える 1

2

あなたが投稿したすべてのコードは別のスレッド内で呼び出されていると思いますので、 QuaternionRotation3Dそのスレッドで作成することはできません。これを解決する方法はいくつかありますが、コードの残りの部分を見ずに推測するのは難しいですが、これらのオプションの1つです動作するはずです。

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);
}));
于 2013-03-19T00:16:37.880 に答える