реализовать цикл while без голодания для перерисовки изображения в wpf - PullRequest
0 голосов
/ 12 октября 2019

У меня есть форма wpf, холст и изображение на холсте. Я хочу, чтобы это изображение перемещалось случайным образом в направлении каждые n миллисекунд. Я использовал пока цикл, но он запасся голодом. поэтому у меня не было возможности реализовать это движение одним событием мыши, чтобы увидеть, насколько хороша моя идея об этом движении. это мой код ниже:

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);
            }

что мне теперь делать?

1 Ответ

1 голос
/ 12 октября 2019

Одна вещь, которую вы можете сделать, если вы действительно хотите цикл, это запустить другой поток и использовать его. Таким образом, ваш пользовательский интерфейс останется отзывчивым.

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));
}

Отказ от ответственности: я написал код в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...