почему цикл While не работает в C # XAML?

#c# #xaml #while-loop

#c# #xaml #цикл while

Вопрос:

Я пытаюсь создать привязки клавиш / горячие клавиши для игры, которую я создаю

Проблема: перемещение выполняется один раз, а затем завершает код.

Я попытался создать постоянный цикл while, чтобы он никогда не покидал код, после того, как я добавил цикл while, он даже не регистрирует нажатую клавишу! я знаю, что проблема связана с циклом while, потому что я вставил его в комментарий, и код работает так же, как и до того, как я закодировал в цикле while. (я тоже использую XAML.) (playerBody — это холст)

код:

 using System;

namespace GameWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {

            InitializeComponent();
        }
        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
           Thickness speed = new Thickness(0, 0, 0, 100);
            bool d = false;
            while (d == false)
            {
                if (e.Key == Key.W)
                {
                    PlayerBody.Margin = speed;
                }
            }
        }
    }
}
 

Комментарии:

1. Вы никогда не устанавливаете d значение true — как вы ожидаете, что это когда-нибудь закончится?

2. Цикл никогда не заканчивается -> поток пользовательского интерфейса заблокирован -> никакое действие пользовательского интерфейса не может быть выполнено -> приложение «застревает»

Ответ №1:

Как уже указывали некоторые люди, бесконечный цикл — не очень хорошая идея.

Я также не думаю, что ваш код выполняется только один раз. На самом деле, он должен выполняться там снова и снова, пока нажата клавиша. Однако вы всегда назначаете одно и то же смещение ( Thickness ). Таким образом, значение всегда остается равным 100, потому что оно не суммируется.

 Thickness speed = new Thickness(0, 0, 0, 100);
// ...
PlayerBody.Margin = speed;
 

Попробуйте что-то вроде этого:

 int speed = 100;
// ...
PlayerBody.Margin = new Thickness(0, 0, 0, PlayerBody.Margin.Bottom   speed);