【问题标题】:How can I create a custom event?如何创建自定义事件?
【发布时间】:2011-01-26 00:32:23
【问题描述】:

我有一组自定义的用户控件:NavigationBar 和 NavigationItem。

我希望每当用户单击 NavigationItem 中的任何位置时都会触发一个事件。我不知道如何设置。

http://i.stack.imgur.com/ocP2D.jpg

我试过了:

public partial class NavigationBar : UserControl
{
    public NavigationBar()
    {
        InitializeComponent();
        SetupEvents();
    }

    public List<NavigationItem> NavigationItems { private get; set; }
    public NavigationItem SelectedItem { get; set; }

    private void SetupEvents()
    {
        navigationItem1.Click += new EventHandler(navigationItemClick);
    }

    void navigationItemClick(object sender, EventArgs e)
    {
        MessageBox.Show("Clicked on " + sender.ToString());
    }
}

但该事件仅在用户专门单击 NavigationItem 控件时触发,而不是在他单击图片或文本时触发。 (即 PictureBox 和 Label)。

最好的做法是什么?我想创建一些好的东西,而不是 hacky 代码。谢谢!

【问题讨论】:

    标签: c# winforms events user-controls


    【解决方案1】:

    把这样的东西放到你的课堂上:

    public event EventHandler NavigationItemClick;
    

    这会在您的班级中创建一个名为 NavigationItemClick 的新事件。表单设计者甚至会看到它。

    在您的方法navigationItemClick 中,您可以这样做来调用事件。

    EventHandler handler = this.NavigationItemClick;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
    

    将事件保存到handler 变量中以避免竞争条件很重要。 EventHandler 是一个委托,因此您将其称为方法,因此 if 语句中的行。 if 本身可确保有人已加入您的活动。

    【讨论】:

    • 我应该在哪个类中创建新事件?
    • 我在 NavigationItem.cs 类中添加了 EventHandler,但表单设计器找不到该特定事件。有什么建议吗?
    • @Sergio:您可以在后面的代码中附加事件处理程序。
    • @Sergio:将事件(我给你的第一行)放入 NavigationBar 类,因为你希望该类的用户拥有该事件。
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2014-06-14
    • 2015-10-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多