在另一个线程中每 .5 秒旋转一次图像
本文关键字:图像 一次 旋转 线程 另一个 | 更新日期: 2023-09-27 17:56:38
我想制作一个小型命运之轮游戏,但是我在制作旋转图像的事件时遇到问题
这是我现在拥有的代码,但它似乎只运行一次_thread
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;
}
));
});
}
你可以
只使用System.Threading.Timer
而不是每次生成一个新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);
});
}
在最坏的情况下,您应该在代码隐藏中使用DispatcherTimer
:
var timer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(0.5)
};
timer.Tick += (s, e) => ((RotateTransform)ImageWheel.RenderTransform).Angle += 15;
timer.IsEnabled = true;
但真的完全没有必要。只需在 XAML 中设置Storyboard
即可。像这样:
<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 上,所以无法检查),但你明白了。你把一些非常简单的事情过于复杂了。