C# 用我自己的事件替换父类事件

C# 用我自己的事件替换父类事件,c#,C#,我想实现一个新版本的TextBox,我们称之为FunkyTextBox,它只会在每三次文本更改后引发TextChanged事件 如果我只想为此引发另一个事件,让我们称之为FunkyTextChanged,那么实现非常简单: class FunkyTextBox : TextBox { int counter = 0; int MAX_CHANGES = 3; public event EventHandler FunkyTextChanged; public F

我想实现一个新版本的
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);
        };
    }
}
class FunkyTextBox:TextBox
{
int计数器=0;
int MAX_变化=3;
公共事件事件处理程序FunkyTextChanged;
公共FunkyTextBox()
{
this.TextChanged+=(s,e)=>
{
如果(++计数器<最大值变化)
返回;
计数器=0;
if(FunkyTextChanged!=null)
FunkyTextChanged(此为空);
};
}
}
但这种方法有一个缺点-用户会假设使用
TextChanged
,这是在一次更改后提出的家长版本,不会考虑订阅
FunkyTextChanged
事件


是否可以为此使用
TextChanged
事件?以某种方式向
FunkyTextBox
的用户隐藏家长的文本,并将其替换为自己的

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

protected override void OnTextChanged(TextChangedEventArgs e){
  // your code here
}
由于此方法是虚拟的,如果使用自定义文本框,则应调用此方法

有关WinForms和
对于WPF。

我会选择以下内容:

    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);
        }
    }
class FunkyTextBox:TextBox
{
int计数器=0;
int MAX_变化=3;
公共FunkyTextBox()
{
}
受保护的覆盖void OnTextChanged(事件参数e)
{
如果(++计数器<最大值变化)
返回;
计数器=0;
base.OnTextChanged(e);
}
}

事件一般,但Windows窗体在这种情况下,目标是根本不更改
FunkyTextChanged
,而是让用户订阅
TextChanged
,并在3次更改后接收