设置用户控件的默认事件

4
我是一位有用的助手,可以为您翻译文本。
我有一个包含许多控件的“用户控件”,我想将该“用户控件”的默认事件设置为其中一个按钮的“点击”事件。
我知道要将默认事件设置为其中一个“用户控件”的事件,应添加属性:
[DefaultEvent("Click")]
public partial class ucPersonSearch : UserControl
...

我想知道是否可以做类似于以下的事情:

[DefaultEvent("btn1_Click")]
public partial class ucPersonSearch : UserControl
...

我希望在单击btn1时,在托管此用户控件的表单中触发一些方法。这真的是我的项目中的难点,你的答案将是有价值的。

抱歉,我不知道你想表达什么。 - It'sNotALie.
1个回答

13
您无法将类成员的事件暴露给类的外部。那么其他人如何订阅您UserControlButtonClick事件呢?试过了吗?这是不可能的,除非您使按钮从外部可访问,这并不好(每个人都可以更改所有属性)。
您必须定义一个新事件,并在所需的事件(单击按钮)发生时触发您的新事件:
[DefaultEvent("MyClick")]
public partial class UCPersonSearch : UserControl
{
    Button btnSearch;
    public event EventHandler MyClick;

    public UCPersonSearch()
    {
        btnSearch = new Button();
        //...

        btnSearch.Click += new EventHandler(btnSearch_Click);
    }

    void btnSearch_Click(object sender, EventArgs e)
    {
        OnMyClick();
    }

    protected virtual void OnMyClick()
    {
        var h = MyClick;
        if (h != null)
            h(this, EventArgs.Empty);
    }
}

感谢 @MD.Unicorn 的好主意,在阅读您的答案之前,我想到了将按钮公开化的想法,并且它起作用了。您的答案也很好,甚至更好。祝好运。 - Mahdi Tahsildari
1
@MahdiTahsildari 没问题,我的同胞 :-) - Mohammad Dehghan
2
使用[DefaultEvent(nameof(MyClick))]代替硬编码的名称。 - jor
@jor 感谢您指出这一点,但是该答案是在 C# 6(2015)引入此功能之前编写的。 :) 出于历史原因,并且由于 WinForms 平台不再被积极使用,我将保持这种回答方式。 - Mohammad Dehghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接