Очень простое решение:
private bool _focusing = false;
protected override void OnEnter( EventArgs e )
{
_focusing = true;
base.OnEnter( e );
}
protected override void OnMouseUp( MouseEventArgs mevent )
{
base.OnMouseUp( mevent );
if( _focusing )
{
this.SelectAll();
_focusing = false;
}
}
РЕДАКТИРОВАТЬ: Оригинальный OP, в частности, был обеспокоен последовательностью мыши-вниз / выделения текста / мыши-вверх, и в этом случае простое решение, приведенное выше, в конечном итоге будет частично выделено.
Это должно решить * проблему (на практике я перехватываю WM_SETCURSOR):
protected override void WndProc( ref Message m )
{
if( m.Msg == 32 ) //WM_SETCURSOR=0x20
{
this.SelectAll(); // or your custom logic here
}
base.WndProc( ref m );
}
* На самом деле следующая последовательность заканчивается частичным выделением текста, но затем, если вы наведете указатель мыши на текстовое поле, весь текст будет выделен снова:
мышь-вниз / выделение текста / мышь-перемещение-выход-текстовое поле / мышь-вверх