Как создавать события и правильно использовать обработчики событий по нажатию кнопки C# - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в C#, и я пытаюсь создать игру «Палач» в WinForms, у меня работает функциональность игры, но я пытаюсь создать форму, в которой пользователь выбирает категорию и то слово, которое нужно угадать, принадлежит выбранной категории. У меня есть HangEventArgs, как показано ниже:

public class HangEventArgs : EventArgs
{
    public Category WordCategory { get; set; }
}

и класс для данных (я надеюсь расширить его, чтобы добавить больше функций в будущем).

public enum Category
{
    // Categories are stores here
}

public class HangData
{
    public Category WordCategory { get; protected set; }

    public HangData(Category askWhat)
    {
        WordCategory = askWhat;
    }
}

И класс, в котором хранятся слова

public static class WordsToGuess
{
    public static string[] Capitals =
    {
        "London",
        "Paris" // more words here
    }; // more categories here

Наконец, у меня есть событие нажатия кнопки для всех категорий, я создал свою собственную кнопку, чтобы не использовать по умолчанию EventArgs.

private void bCategory_Click(object sender, HangEventArgs e)
{
    MainGame mg = new MainGame(new HangData(e.WordCategory));
    mg.ShowDialog();
}

Я пытался использовать такие обработчики событий

public event EventHandler<HangEventArgs>(object sender, HangEventArgs e);

Но я не уверен, как правильно реализовать это в моем коде. Если я использую

bCapitals.Click += new EventHandler(bCategory_Click);

, я получаю сообщение об ошибке делегата, не совпадающее с перегрузкой, и не могу решить, как это исправить. Заранее спасибо за помощь.

1 Ответ

2 голосов
/ 17 июня 2020

Создайте кнопку категории следующим образом:

public class CategoryButton : Button
{
    protected override void OnClick(EventArgs e)
    {
        // Just discard the `e` argument and pass your own argument.
        base.OnClick(new HangEventArgs { WordCategory = Category.Cities });
    }
}

Подпишитесь на событие с помощью:

categoryButton1.Click += CategoryButton1_Click;

Используйте вот так

private void CategoryButton1_Click(object sender, EventArgs e)
{
    if (e is HangEventArgs hangEventArgs) {
        MessageBox.Show(hangEventArgs.WordCategory.ToString());
    }
}

Обратите внимание, что механизм щелчка по-прежнему работает, как ожидалось. Вам не нужно запускать событие самостоятельно.


Конечно, вы можете создать свое собственное событие; однако тогда у него должно быть другое имя, например HangClick, и вы должны запустить его самостоятельно.

public class CategoryButton : Button
{
    public event EventHandler<HangEventArgs> HangClick;

    protected virtual void OnHangClick(HangEventArgs e)
    {
        HangClick?.Invoke(this, e);
    }

    protected override void OnClick(EventArgs e)
    {
        OnHangClick(new HangEventArgs { WordCategory = Category.Cities });

        // Optionally, if you want to preserve the standard click event behaviour:
        base.OnClick(e);
    }
}

Подпишитесь с помощью:

categoryButton1.HangClick += CategoryButton1_HangClick;

Используйте это так:

private void CategoryButton1_HangClick(object sender, HangEventArgs e)
{
    MessageBox.Show(e.WordCategory.ToString());
}
...