none
重写TextBox的OnMouseDoubleClick事件 RRS feed

  • 问题

  • ********************************

    我想重写这个事件,但我确实不想用base.OnMouseDoubleClick(e),当我删除这行代码的时候,程序就不引用了,C#为什么会这么处理呢?

    我想让TextBox双击后不要选中周围的字符,光标还是停留在双击的位置
    • 已编辑 dream99 2015年6月8日 2:55
    2015年6月8日 2:48

答案

  • Hello,

    >>我想重写这个事件,但我确实不想用base.OnMouseDoubleClick(e),当我删除这行代码的时候,程序就不引用了,C#为什么会这么处理呢?

    “base.OnMouseDoubleClick(e);”的方法里,有调用向MouseDoubleClick委托的一个实例,这个实例会触发所登记的方法:

    [EditorBrowsable(EditorBrowsableState.Advanced)]
    
            protected virtual void OnMouseDoubleClick(MouseEventArgs e) {
    
                Contract.Requires(e != null);
    
                MouseEventHandler handler = (MouseEventHandler)Events[EventMouseDoubleClick];
    
                if (handler != null) handler(this, e);
    
            }
    

    这个是control.cs源代码里的。

    >>我想让TextBox双击后不要选中周围的字符,光标还是停留在双击的位置

    不让周围字符选中,你可以用this.textBox1.SelectionLength = 0;,但是这个不能让光标停留在双击位置,你需要每次记录下最后一次光标的位置,这个可以用单击事件来做:

    
    
    namespace P20150608
    
    {
    
        public partial class Form1 : Form
    
        {
    
            int cursorPosition = 0;
    
    
            public Form1()
    
            {
    
                InitializeComponent();
    
            }
    
    
            private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    
            {
    
                //this.textBox1.HideSelection = false;
    
    
    
    
                this.textBox1.SelectionStart = cursorPosition;
    
                this.textBox1.SelectionLength = 0;
    
            }
    
    
            private void textBox1_MouseClick(object sender, MouseEventArgs e)
    
            {
    
                cursorPosition = this.textBox1.SelectionStart;
    
            }
    
        }
    
    
        public class MyTextBox : TextBox
    
        {
    
            protected override void OnMouseDoubleClick(MouseEventArgs e)
    
            {
    
                base.OnMouseDoubleClick(e);
    
            }
    
        }
    
    
    }
    

    Regards.


    2015年6月8日 8:37
    版主

全部回复

  • Hello,

    >>我想重写这个事件,但我确实不想用base.OnMouseDoubleClick(e),当我删除这行代码的时候,程序就不引用了,C#为什么会这么处理呢?

    “base.OnMouseDoubleClick(e);”的方法里,有调用向MouseDoubleClick委托的一个实例,这个实例会触发所登记的方法:

    [EditorBrowsable(EditorBrowsableState.Advanced)]
    
            protected virtual void OnMouseDoubleClick(MouseEventArgs e) {
    
                Contract.Requires(e != null);
    
                MouseEventHandler handler = (MouseEventHandler)Events[EventMouseDoubleClick];
    
                if (handler != null) handler(this, e);
    
            }
    

    这个是control.cs源代码里的。

    >>我想让TextBox双击后不要选中周围的字符,光标还是停留在双击的位置

    不让周围字符选中,你可以用this.textBox1.SelectionLength = 0;,但是这个不能让光标停留在双击位置,你需要每次记录下最后一次光标的位置,这个可以用单击事件来做:

    
    
    namespace P20150608
    
    {
    
        public partial class Form1 : Form
    
        {
    
            int cursorPosition = 0;
    
    
            public Form1()
    
            {
    
                InitializeComponent();
    
            }
    
    
            private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    
            {
    
                //this.textBox1.HideSelection = false;
    
    
    
    
                this.textBox1.SelectionStart = cursorPosition;
    
                this.textBox1.SelectionLength = 0;
    
            }
    
    
            private void textBox1_MouseClick(object sender, MouseEventArgs e)
    
            {
    
                cursorPosition = this.textBox1.SelectionStart;
    
            }
    
        }
    
    
        public class MyTextBox : TextBox
    
        {
    
            protected override void OnMouseDoubleClick(MouseEventArgs e)
    
            {
    
                base.OnMouseDoubleClick(e);
    
            }
    
        }
    
    
    }
    

    Regards.


    2015年6月8日 8:37
    版主
  • 谢谢你!^_^,已经解决问题了,但是可不可以通过重写的方式解决呢?因为双击之后,在这个textText.SelectionLength = 0;之前,textbox还是会选中。
    2015年6月10日 2:22
  • Hello,

    >>但是可不可以通过重写的方式解决呢?因为双击之后,在这个textText.SelectionLength = 0;之前,textbox还是会选中。

    不是很确定是否可以这么做,应该这个行为看起来像一个系统层次的表现。不过.NET 现在开源类你可以到这个网址查看原有button的实现:

    http://referencesource.microsoft.com/#System,namespaces

    你可以看里面的具体实现,看能否重写这个行为。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年6月10日 6:42
    版主
  • 好的^_^
    2015年6月12日 13:51