0

画像を含むボタンがあり、コードの実行中にその画像を回転させ、この処理の最後で停止させたい。

ストーリーボードを開始すると、私のコードはほとんど機能しますが、sb.Stop() という行を追加すると、アニメーションが開始されません。

これが私のコードです:

private void refreshPostIt(int postItIndex)
    {
        Button btn = // Button to rotate

        Storyboard sb = new Storyboard();
        DoubleAnimation rotate = new DoubleAnimation();
        rotate.From = 0;
        rotate.To = 360;
        rotate.RepeatBehavior = RepeatBehavior.Forever;

        RotateTransform rt = new RotateTransform();
        btn.RenderTransformOrigin = new Point(0.5, 0.5);
        btn.RenderTransform = rt;
        Storyboard.SetTarget(rotate, btn);
        Storyboard.SetTargetName(rotate, btn.Name);
        Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));
        sb.Children.Add(rotate);
        sb.Begin(this, true);

        // Some code which can take several seconds

        sb.Stop();
    }

私は立ち往生しています。

4

1 に答える 1

0

私には自分に合った解決策があります。

private void refreshPostIt()
    {
        // Button btn; is defined somewhere else

        Storyboard sb = new Storyboard();
        DoubleAnimation rotate = new DoubleAnimation();
        rotate.From = 0;
        rotate.To = 360;
        rotate.RepeatBehavior = RepeatBehavior.Forever;

        RotateTransform rt = new RotateTransform();
        btn.RenderTransformOrigin = new Point(0.5, 0.5);
        btn.RenderTransform = rt;
        Storyboard.SetTarget(rotate, btn);
        Storyboard.SetTargetName(rotate, btn.Name);
        Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));
        sb.Children.Add(rotate);
        sb.Begin(btn, true);

            // Do your stuff here (Not in the UI Thread)
            // Maybe use a semaphore to lock the sb.Stop(btn)

        sb.Stop(btn);
    }

サンプルコード全体:

public partial class Window1 : Window
{
    Button btn;
    Storyboard sb;
    public Window1()
    {
        btn = new Button();
        InitializeComponent();
        this.grid.Children.Add(btn);
        refreshPostIt();
    }

    private void refreshPostIt()
    {
        // Button btn; is defined somewhere else

        sb = new Storyboard();
        DoubleAnimation rotate = new DoubleAnimation();
        rotate.From = 0;
        rotate.To = 360;
        rotate.RepeatBehavior = RepeatBehavior.Forever;

        RotateTransform rt = new RotateTransform();
        btn.RenderTransformOrigin = new Point(0.5, 0.5);
        btn.RenderTransform = rt;
        Storyboard.SetTarget(rotate, btn);
        Storyboard.SetTargetName(rotate, btn.Name);
        Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));
        sb.Children.Add(rotate);
        sb.Begin(btn, true);

        BackgroundWorker asd = new BackgroundWorker();
        asd.DoWork += new DoWorkEventHandler(asd_DoWork);
        asd.RunWorkerCompleted += new RunWorkerCompletedEventHandler(asd_RunWorkerCompleted);
        asd.RunWorkerAsync();

    }

    void asd_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (sb != null)
        {
            sb.Stop(btn);
        }
    }

    void asd_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(2000);
    }
}

わかりました、ここであなたの問題だと思うことを説明したいと思います。UIスレッドを使用して「作業」を行うと、UIを更新できず、回転をアニメーション化することはできませんが、「作業」が完了すると、アニメーションの開始と停止の間で、最終的に時間がかかりますUI を更新するには、アニメーションを停止するために呼び出します。これにより、アニメーションが表示されなくなります。これが起こらないようにするには、作業を別のスレッドに入れる必要があります。

それが役立つことを願っています。

于 2012-05-30T14:39:12.313 に答える