Активировать события щелчка и наведения курсора одновременно?

#c# #.net #winforms

#c# #.net #winforms

Вопрос:

Я пытаюсь создать форму, в которой пользователь выбирает один из 2 переключателей, «быстрый» и «медленный», затем нажимает кнопку «перейти» в форме. Это должно работать следующим образом:

  • Когда выбран параметр «быстро» и нажата кнопка «перейти», пользователю необходимо продолжать удерживать нажатой кнопку, чтобы заставить игрока двигаться, и игрок останавливается, когда пользователь отпускает палец с кнопки. Для этого я использую MouseDown MouseUp события и .

  • Если выбрано значение «медленно», пользователь может перемещаться только на один шаг за раз, независимо от того, как долго кнопка удерживается нажатой. для этого я использую Click событие.

Чтобы проверить эту концепцию, я вставил a MessageBox в Click MouseDown события и, чтобы посмотреть, как они работают вместе. Однако, когда я нажимаю на кнопку, я вижу только Mousedown запуск события, независимо от того, какой переключатель выбран Click , и событие запускается только тогда, когда кнопка go находится в фокусе, и я нажимаю enter.

Как я могу сделать так, чтобы оба события вызывались одновременно (и тогда я могу ввести соответствующий if оператор, чтобы различать «быстрые» и «медленные» переключатели)? (Кнопка подключается к этим событиям двойным щелчком по их соответствующему обработчику в окне разработки, а не жестко запрограммирована).

 private void go_button_MouseDown(object sender, MouseEventArgs e)
{
    Console.WriteLine("Mousedown"); //  Doesn't show in console window in Release mode, still trying to solve this

    MessageBox.Show("Mosuedown");
}
private void go_button_Click(object sender, EventArgs e)
{
    Console.Out.WriteLine("go_buttonclick"); // Doesn't show in console window in Release mode, still trying to solve this
    Console.WriteLine("go_buttonclick"); //  Doesn't show in console window in Release mode, still trying to solve this
    MessageBox.Show("go_buttonclick");
}
  

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

1. Я не уверен, что понимаю ваше описание поведения для Click события. Обратите внимание, что Click событие будет запущено после того, как пользователь отпустит кнопку мыши (это то, что вы хотите?) Или если кнопка нажата любым другим способом (например, с помощью клавиатуры).

2. Вероятно, вам все равно не нужно Click событие. Просто используйте что-то вроде if (fast.Checked) { StartMoving(); } under MouseDown и if (fast.Checked) { StopMoving(); } under MouseUp , и тогда у вас может быть else блок либо под MouseDown , либо MouseUp (вы решаете), куда вы звоните MoveOneStep(); .

3. В WinForms нет окна «Консоль». Используйте System.Diagnostics.Debug.WriteLine(...); и смотрите в окне вывода в Visual Studio.

4. Спасибо, это имеет смысл, я мог бы сделать это таким образом. Не был уверен, есть ли объяснение, почему при щелчке мыши запускается только одно из событий или это была просто Visual studio quirk.@41686d6564

5. Теперь я это вижу @HansPassant, спасибо. Просто попробовал еще раз, удалив одно из сообщений, и оно отобразило 2 других события!

Ответ №1:

Я обнаружил, что я делаю неправильно, оба события запускаются одновременно, но окно сообщения в событии MouseDown не позволяло мне видеть, что события Click и MouseUp также запускаются. Когда я отключил окно сообщений наведения курсора мыши, появились другие 2 окна сообщений, спасибо!