4

我想实现一个新版本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事件?以某种方式向用户隐藏父母的 TextChnagedFunkyTextBox并用它自己的替换它?

4

2 回答 2

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);
        }
    }
于 2013-03-01T12:45:35.817 回答
2

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

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

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

有关WinForms, 请参见此处,有关 WPF,请参见此处

于 2013-03-01T12:21:54.313 回答