用我自己的替换父类事件

时间:2013-03-01 12:16:35

标签: c#

我想要实现TextBox的新版本,我们称之为FunkyTextBox,只有在每隔三次文本更改后才会引发TextChanged事件。

如果我只是想为此提出另一个事件,我们称之为FunkyTextChanged,实现很简单:

class FunkyTextBox : TextBox
{
    int counter = 0;
    int MAX_CHANGES = 3;
    public event EventHandler FunkyTextChanged;

    public FunkyTextBox()
    {
        this.TextChanged += (s, e) =>
        {
            if (++counter < MAX_CHANGES)
                return;
            counter = 0;
            if (FunkyTextChanged != null)
                FunkyTextChanged(this, null);
        };
    }
}

但是这种方法有一个缺点 - 用户会假设使用TextChanged,这是在单次更改后引发的父级版本,并且不会考虑订阅FunkyTextChanged事件。

是否可以使用TextChanged事件?以某种方式隐藏父文件的TextChnaged来自FunkyTextBox的用户并用它自己替换它?

2 个答案:

答案 0 :(得分:3)

我会选择类似的东西:

    class FunkyTextBox : TextBox
    {
        int counter = 0;
        int MAX_CHANGES = 3;

        public FunkyTextBox()
        {
        }

        protected override void OnTextChanged(EventArgs e)
        {
            if (++counter < MAX_CHANGES)
                return;
            counter = 0;
            base.OnTextChanged(e);
        }
    }

答案 1 :(得分:2)

只需使用您的实现覆盖OnTextChanged受保护的方法即可。

protected override void OnTextChanged(TextChangedEventArgs e){
  // your code here
}

由于此方法是虚拟的,因此如果您使用自定义文本框,则应调用此方法。

请参阅here获取WinForms和 WPF here