Как сделать событие нажатия клавиши в C# - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать событие KeyPress в форме, но в этой строке я получил сообщение об ошибке MainWindow.KeyPress = new KeyPressEventArgs(Form_KeyPress);, я прочитал Документы Microsoft о событиях в C#, но не понял.

Слушатели, как в Java существуют в C# или нет?

Мой код:

class PracticeEvent
{
    static void Main(String[] args)
    {
        Form MainWindow = new Form();
        MainWindow.Text = "Practice";
        MainWindow.MaximizeBox = false;
        MainWindow.MinimizeBox = false;
        MainWindow.FormBorderStyle = FormBorderStyle.FixedSingle;
        MainWindow.StartPosition = FormStartPosition.CenterScreen;
        MainWindow.Size = new Size(1000, 700);
        MainWindow.KeyPreview = true;
        MainWindow.KeyPress = new KeyPressEventArgs(Form_KeyPress); 

        MainWindow.ShowDialog();

    }

    private void Form_KeyPress(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        if(e.KeyCode == Keys.A){
            MessageBox.Show("You pressed the A key.");
        }
    }

}

Ответы [ 2 ]

1 голос
/ 18 марта 2020

В вашем коде несколько ошибок.

MainWindow.KeyPress = new KeyPressEventArgs(Form_KeyPress);

1) KeyPress имеет тип KeyPressEventHandler. Не KeyPressEventArgs. В C# классы, которые называются ...EventArgs, обычно используются как специальные объекты, которые содержат данные о возбужденном событии, и они наследуются от системного класса EventArgs. И классы, которые вызывают ...EventHandlers, обычно определяют оболочку для делегатов и вызываемых событий.

2) Таким образом, KeyPress является событием. Если вы хотите подписаться на это событие, вы должны использовать оператор +=. И метод, который вы хотите указать в качестве обработчика, должен иметь подпись void(object, KeyPressEventArgs). Типичная подпись для событий: void(object, ...EventArgs)

private void Form_KeyPress(object sender, System.Windows.Forms.KeyEventArgs e)

3) Как я уже говорил, этот метод имеет неправильную подпись (KeyPressEventArgs вместо KeyEventArgs).

4) Должно быть static. Вы не можете использовать не-stati c членов класса в методе stati c.

Поэтому ваш код должен выглядеть следующим образом:

    class PracticeEvent
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            Form MainWindow = new Form();
            MainWindow.Text = "Practice";
            MainWindow.MaximizeBox = false;
            MainWindow.MinimizeBox = false;
            MainWindow.FormBorderStyle = FormBorderStyle.FixedSingle;
            MainWindow.StartPosition = FormStartPosition.CenterScreen;
            MainWindow.Size = new Size(1000, 700);
            MainWindow.KeyPreview = true;
            MainWindow.KeyPress += Form_KeyPress;
            MainWindow.ShowDialog();
        }

        private static void Form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == 'a')
            {
                MessageBox.Show("You pressed the A key.");
            }
        }
    }

Использовать слушателей в C# не хорошая практика, но некоторые фреймворки используют ее. Обычно используются события и обратные вызовы.

И мой последний совет. Может быть, вы хотите использовать событие KeyDown? KeyPress используется для работы с вводом символов.

1 голос
/ 18 марта 2020

Ваш основной метод - stati c, а ваш обработчик событий - нет. Вы должны предоставить ему ссылку на объект, вот что пытается сказать сообщение об ошибке. Другая ошибка заключается в том, что вы присваиваете, а не присоединяете обработчик, для этого используйте оператор +=.

В частности, измените эту строку:

MainWindow.KeyPress = new KeyPressEventArgs(Form_KeyPress);

на

var instance = new PracticeEvent();
MainWindow.KeyPress += instance.Form_KeyPress;
...