【问题标题】:How to create events and proper use of event handlers for a button click C#如何为按钮单击 C# 创建事件和正确使用事件处理程序
【发布时间】:2020-06-17 16:56:34
【问题描述】:

我是 C# 的新手,我正在尝试在 WinForms 中创建一个 Hangman 游戏,我已经让游戏功能正常工作,但我正在尝试创建一个表单,用户选择一个类别,然后要猜测的单词来自所选类别。 我有一个 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);

我得到了一个没有重载匹配委托错误,我一直在想如何解决它。提前感谢您的帮助。

【问题讨论】:

  • 您的 HangEventArgs 类是从 EventArgs 派生的吗?是否有特殊原因不能使用默认事件参数来单击按钮?
  • 还有 bCapitals.Click += new EventHandler(bCategory_Click);应该是 bCategory.Click += new EventHandler(bCategory_Click);好像你可能绑定了错误的按钮

标签: c# winforms event-handling delegates


【解决方案1】:

像这样创建您的类别按钮:

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

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2013-12-24
    • 2011-10-16
    • 1970-01-01
    • 2011-11-08
    • 2012-04-20
    相关资源
    最近更新 更多