0

プログレスバーのように機能し、イベントへの応答として長方形の幅をアニメーション化するユーザーコントロールがあります。誰かが特定の%でイベントを発生させ、長方形の幅が実際の幅からユーザーコントロールのactualWidthの%までアニメーション化されます。

新しい幅を設定しようとすると、「別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」というメッセージが表示されるので、Dispatcher.Invokeを使用すると、正常に実行されます。

幅の変更を設定するだけでなく、アニメーション化しようとすると、問題が発生します。次に、ディスパッチャを使用すると、別のスレッドがエラーイベントを所有するようになります。

それで。このコードはうまく機能します:

bar.Dispatcher.Invoke((Action)delegate { bar.Width = myWidth; });

しかし、このコードは次のことを行いません。

DoubleAnimation widthAnimation = new DoubleAnimation();
widthAnimation.From = bar.ActualWidth;
widthAnimation.To = myWidth;
widthAnimation.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 500));
widthAnimation.RepeatBehavior = new RepeatBehavior(1);
bar.Dispatcher.Invoke( (Action)delegate {
    bar.BeginAnimation(Rectangle.WidthProperty, widthAnimation); 
});

だから..このようなユーザーコントロールでアニメーションを実行するにはどうすればよいですか?

前もって感謝します !!!

4

1 に答える 1

1

アニメーションも UI スレッドで作成する必要があります。

bar.Dispatcher.Invoke((Action)delegate
{
    var widthAnimation = new DoubleAnimation
    {
        From = bar.ActualWidth,
        To = myWidth,
        Duration = TimeSpan.FromMilliseconds(500)
    };
    bar.BeginAnimation(Rectangle.WidthProperty, widthAnimation); 
});
于 2013-01-14T10:22:15.140 に答える