0

我有一个 wpf 表单和一个画布,还有一个画布中的图像。我希望这张图片每隔 n 毫秒随机移动一次。我使用了while循环,但它被饿死了。所以我无法通过一个鼠标事件来实现这个动作,看看我对这个动作的想法有多好。这是我下面的代码:

public void movebox()
        {
            Random rnd = new Random();
            int movex = rnd.Next(0, 2);
            int movey = rnd.Next(0, 2);
            Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
            Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
        }
private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            movebox();
        }

我喜欢图像的移动,但现在我有同样的问题。我需要这个对象每隔 n 毫秒自动移动一次而不会饿死。这是我的理想代码如下:

while(true){
                Random rnd = new Random();
                int movex = rnd.Next(0, 2);
                int movey = rnd.Next(0, 2);
                Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
                Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
                Thread.Sleep(1000);
            }

我现在该怎么办?

4

1 回答 1

1

如果你真的想要一个循环,你可以做的一件事是启动另一个线程并使用它。这样,您的 UI 将保持响应。

public void movebox()
{
    Task.Run(() => 
    {
        while(true)
        {
            Random rnd = new Random();
            int movex = rnd.Next(0, 2);
            int movey = rnd.Next(0, 2);
            Dispatcher.Invoke(() => {
                Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
                Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
            });
            Thread.Sleep(1000);
        }
    });
}

然而,更好的方法是Timer像这样使用:

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    Random rnd = new Random();
    int movex = rnd.Next(0, 2);
    int movey = rnd.Next(0, 2);
    Canvas.SetTop(image1, Canvas.GetTop(image1) + (movey == 1 ? 1 : -1));
    Canvas.SetLeft(image1, Canvas.GetLeft(image1) + (movex == 1 ? 1 : -1));
}

免责声明:我已经在浏览器中编写了代码。

于 2019-10-12T06:02:52.907 回答