0

小さなホイールオブフォーチュンゲームを作りたいのですが、画像を回転させるイベントの作成に問題があります

これは私が今持っているコードですが、_threadを1回だけ実行しているようです

    private readonly Timer _timer;
    private Thread _thread;
    private int _angle;

    public MainWindow()
    {
        InitializeComponent();
        _timer = new Timer(500);
        _timer.Elapsed += RotateWheelEvent;
        _timer.Start();

        _angle = 0;

        SetupRotationThread();
        _thread.Start();
    }

        public void RotateWheelEvent(object sender, EventArgs args)
    {
        _thread.Abort();
        _angle = _angle + 15;
        _thread.Start();
    }

    public void SetupRotationThread()
    {
        var rotatetransform = new RotateTransform(_angle);

        _thread = new Thread(
            delegate()
                {
                    ImageWheel.Dispatcher.Invoke(
                        System.Windows.Threading.DispatcherPriority.SystemIdle,
                        TimeSpan.FromSeconds(1),
                        new Action(
                            delegate()
                                {
                                    ImageWheel.RenderTransformOrigin = new Point(0.5, 0.5);
                                    ImageWheel.RenderTransform = rotatetransform;
                                }
                            ));
                });
    }
4

2 に答える 2

3

毎回新しいスレッドを生成するSystem.Threading.Timer代わりに、 a を使用できます。System.Timer

        private System.Threading.Timer _timer;
        private int _angle;

        public MainWindow()
        {
            InitializeComponent();
              _timer = new System.Threading.Timer((o) => 
              {
                  _angle += 15;
                  Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate
                  {
                      ImageWheel.RenderTransformOrigin = new Point(0.5, 0.5);
                      ImageWheel.RenderTransform = new RotateTransform(_angle);
                  }); 
              }, null, 500, 500);
        }

ただし、これをスレッド化する理由はまったく明確ではありません。UI スレッドにコードを呼び出すだけのスレッドを開始しているようです。このスレッドが実行する必要がある作業は見当たりません。

だから私はあなたが必要だと思うのはこれだけです

private readonly Timer _timer;
private int _angle;

    public MainWindow()
    {
        InitializeComponent();
        _timer = new Timer(500);
        _timer.Elapsed += RotateWheelEvent;
        _timer.Start();
        _angle = 0;
    }

    public void RotateWheelEvent(object sender, EventArgs args)
    {
        Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate
        {
            _angle += 15;
            ImageWheel.RenderTransformOrigin = new Point(0.5, 0.5);
            ImageWheel.RenderTransform = new RotateTransform(_angle);
        }); 
    }
于 2013-01-29T23:38:44.150 に答える
1

最悪の場合DispatcherTimer、コードビハインドでを使用する必要があります。

var timer = new DispatcherTimer
{
    Interval = TimeSpan.FromSeconds(0.5)
};

timer.Tick += (s, e) => ((RotateTransform)ImageWheel.RenderTransform).Angle += 15;
timer.IsEnabled = true;

しかし、それはまったく必要ありません。StoryboardXAMLでを設定するだけです。何かのようなもの:

<Image x:Name="image" RenderTransformOrigin="0.5,0.5" ...>
    <Image.RenderTransform>
        <RotateTransform/>
    </Image.RenderTransform>
    <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard Duration="00:00:00.5" RepeatBehavior="Forever">
                    <DoubleAnimation Storyboard.TargetName="image" Storyboard.TargetProperty="(Image.RenderTransform).(RotateTransform.Angle)" By="15"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Image.Triggers>
</Image>

その構文のいくつかは完全に正しくないかもしれませんが(Linuxではチェックできないため)、あなたはその考えを理解します。あなたは非常に単純なものを過度に複雑にしました。

于 2013-01-30T00:17:59.980 に答える