Hacer que un cuadro de texto WinForms se comporte como la barra de direcciones de su navegador

154

Cuando un cuadro de texto C # WinForms recibe foco, quiero que se comporte como la barra de direcciones de su navegador.

Para ver a qué me refiero, haga clic en la barra de direcciones de su navegador web. Notarás el siguiente comportamiento:

  1. Al hacer clic en el cuadro de texto debería seleccionar todo el texto si el cuadro de texto no estaba enfocado previamente.
  2. El mouse hacia abajo y arrastrar en el cuadro de texto debe seleccionar solo el texto que he resaltado con el mouse.
  3. Si el cuadro de texto ya está enfocado, al hacer clic no se selecciona todo el texto.
  4. Enfocar el cuadro de texto mediante programación o mediante tabulación del teclado debería seleccionar todo el texto.

Quiero hacer exactamente esto en WinForms.

ALERTA DE ARMA MÁS RÁPIDA: ¡lea lo siguiente antes de responder! Gracias chicos. :-)

Llamar a .SelectAll () durante los eventos .Enter o .GotFocus no funcionará porque si el usuario hizo clic en el cuadro de texto, el cursor se colocará donde hizo clic, anulando la selección de todo el texto.

Llamar a .SelectAll () durante el evento .Click no funcionará porque el usuario no podrá seleccionar ningún texto con el mouse; la llamada .SelectAll () seguirá sobrescribiendo la selección de texto del usuario.

Llamar a BeginInvoke (cuadro de texto (Acción) .Seleccionar todo) en foco / ingresar evento enter no funciona porque infringe la regla # 2 anterior, seguirá anulando la selección del usuario en foco.

Judá Gabriel Himango
fuente
3
Aclare que esto es para un "RichTextBox".
Nescio
Nescio, un cuadro de texto o un cuadro de texto enriquecido será suficiente. También probé tu solución en un cuadro de texto.
Judá Gabriel Himango
Esta es una fuga de abstracción. La mejor manera de hacerlo es marcar WM_MOUSEACTIVATE y SelectAll en WM_SETFOCUS si no es WM_MOUSEACTIVATE-ing.
wqw
Versión de WPF: stackoverflow.com/questions/4161531/…
Jonathan Allen el

Respuestas:

109

En primer lugar, ¡gracias por las respuestas! 9 respuestas totales. Gracias.

Malas noticias: todas las respuestas tenían algunas peculiaridades o no funcionaban bien (o no funcionaban). Agregué un comentario a cada una de tus publicaciones.

Buenas noticias: he encontrado una manera de hacerlo funcionar. Esta solución es bastante sencilla y parece funcionar en todos los escenarios (pasar el mouse, seleccionar texto, enfocar, etc.)

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

Por lo que puedo decir, esto hace que un cuadro de texto se comporte exactamente como la barra de direcciones de un navegador web.

Esperemos que esto ayude al próximo tipo que intenta resolver este problema engañosamente simple.

Gracias de nuevo, muchachos, por todas sus respuestas que me ayudaron a encaminarme hacia el camino correcto.

Judá Gabriel Himango
fuente
¿Qué pasa cuando el foco se establece programáticamente en un TextBox? Tengo ese problema como se discutió aquí: stackoverflow.com/questions/24790704/... Pude resolverlo, de alguna manera, pero todavía estoy nervioso por eso, ya que mi "solución" parece bastante torpe.
B. Clay Shannon
Usted escribió: "Llamar a .SelectAll () durante los eventos .Enter o .GotFocus no funcionará porque si el usuario hizo clic en el cuadro de texto, el cursor se colocará donde hizo clic, anulando la selección de todo el texto". Tengo SelectAll en el evento GotFocus que, en su mayor parte, funciona. De hecho, creo que colocar el cursor donde el usuario hizo clic es "algo bueno". Solo quiero que siempre se seleccione cuando el foco se establece en TextBox mediante programación.
B. Clay Shannon
Y estoy aquí de nuevo! :)
dotNET
3
Debe mover el alreadyFocused = true;mouseUp fuera de la instrucción if. Porque si selecciona inmediatamente partes del texto, el siguiente clic seleccionará todo el texto nuevamente.
Robert S.
A continuación hay una respuesta de línea única: BeginInvoke ((Acción) MyTextBox.SelectAll); --- Vale la pena mirarlo. Parece hacer todo lo que se requiere
General Gray
78

Encontré una solución más simple para esto. Implica iniciar SelectAll de manera asíncrona Control.BeginInvokepara que ocurra después de que ocurran los eventos Enter y Click:

C ª#:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

En VB.NET (gracias a Krishanu Dey )

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub
Duncan Smart
fuente
55
La respuesta más inteligente que he encontrado ... Muchas gracias ... Por VB.net Aquí está la solución ... Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey
Class Much 'La mejor solución, como la barra de URL del navegador web, much class End Class
ar.dll
77
En .Net 4.0 puede hacer: BeginInvoke ((Acción) MyTextBox.SelectAll);
JoelFan
2
Desafortunadamente, BeginInvoke no funciona para mí (sin duda debido a mi versión desastrosamente polvorienta de Dot net). Pretendiendo "Control". no sirve de nada, ni antepone el nombre del TextBox en sí. Solo y pálido merodeando ...
B. Clay Shannon
2
Tenga en cuenta que esta solución no se comporta exactamente como se describe en la pregunta. Específicamente Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.no funciona como se desea. Pero sigue siendo la solución más corta y elegante :)
Marcus Mangelsdorf
30

Su solución es buena, pero falla en un caso específico. Si asigna el foco TextBox seleccionando un rango de texto en lugar de simplemente hacer clic, el indicador ya enfocado no se establece en verdadero, por lo que cuando hace clic en TextBox por segunda vez, se selecciona todo el texto.

Aquí está mi versión de la solución. También puse el código en una clase que hereda TextBox, por lo que la lógica está muy bien escondida.

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}
nzhenry
fuente
2
¡+1 para sugerencias de cuadros de texto personalizados y una solución que funciona perfectamente!
Alimentado el
Excelente solución Copié su código directamente en mi solución, cambié el espacio de nombres para proteger a los inocentes y funcionó perfectamente. ¡Gracias!
kenswdev
8

Es un poco burlón, pero en su evento de clic, use SendKeys.Send( "{HOME}+{END}" );.

Todd Benning
fuente
Woofta! Eso es un poco de piratería informática! :-) Gracias por la sugerencia. ¿Alguna idea mejor?
Judá Gabriel Himango
Hackear de hecho, pero esto no suena nada mal
Terry
3
Tenga en cuenta que muchos programas antivirus interceptan y bloquean ENVIAR CLAVES como maliciosos. No es una gran solución.
Judá Gabriel Himango el
4

Haga clic en evento de cuadro de texto? O incluso el evento MouseCaptureChanged funciona para mí. - OKAY. no funciona

Entonces tienes que hacer 2 cosas:

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

También funciona para tabular (a través de cuadros de texto al uno): llame a SelectAll () en Enter por si acaso ...

Jakub Kotrla
fuente
Ok Jakub, eso funciona parcialmente. Si tabulo el cuadro de texto, necesita enfocarse. ¿Funcionará con su solución? (Si puede mostrarme cómo, marcaré su respuesta como la respuesta correcta.)
Judah Gabriel Himango
Jakub, ahora que has publicado el código, parece que a veces funciona. No siempre; en este momento estoy haciendo clic en el cuadro de texto y no está seleccionando todo.
Judá Gabriel Himango
A veces hago clic en el texto y no selecciona todo. Es como si de alguna manera el campo .f no estuviera configurado como debería ser, y luego no se llama a SelectAll. ¿No has visto esto?
Judá Gabriel Himango
Solo sé que debido a mouseMouve, puede hacer clic lentamente mientras mueve el mouse (especialmente en letras anchas) -> desactivar la bandera. Puede eliminar el código en el evento mouseMove, pero de lo que obtiene - después de tabbgin para controlar y luego hacer clic - reSelectAll - no se puede seleccionar parte de la agitación en el primer arrastre
Jakub Kotrla
4

Una respuesta de una línea que uso ... puede que te estés pateando ...

En el evento Enter:

txtFilter.BeginInvoke (nuevo MethodInvoker (txtFilter.SelectAll));


fuente
1
No, no funciona. Selecciona todo el texto, pero también evita que el usuario seleccione solo una parte del texto, entre otros problemas.
Judah Gabriel Himango
Lo siento, debo haber entendido mal el comportamiento que estabas buscando. Al ingresar, selecciona todo, si hace clic y lo mantiene, seleccione desde el principio hasta el cursor. Supongo que podría usar lo que tengo y reemplazar SelectAll con su propia lógica de selección. notifywire.com/demos/2009-04-14_1248.swf
¡Funciona genial! El primer clic entra en el cuadro; luego haga clic y arrastre para seleccionar texto.
D_Bester
Nota: no funciona como la barra de direcciones de un navegador web. La barra de direcciones de un navegador web le permite mover el mouse hacia abajo en el cuadro de texto y arrastrar / seleccionar, incluso cuando el cuadro de texto aún no tiene el foco. Esta solución no resuelve eso. Si está de acuerdo con eso, genial, pero no cumple con los requisitos de esta pregunta.
Judá Gabriel Himango
3
'Inside the Enter event
TextBox1.SelectAll();

Ok, después de probarlo aquí es lo que quieres:

  • En el evento Enter, inicie una bandera que indique que ha estado en el evento enter
  • En el evento Click, si configura el indicador, llame a .SelectAll () y restablezca el indicador.
  • En el evento MouseMove, establezca el indicador ingresado en falso, lo que le permitirá hacer clic en resaltar sin tener que ingresar primero al cuadro de texto.

Esto seleccionó todo el texto en la entrada, pero luego me permitió resaltar parte del texto o permitirle resaltar en el primer clic.

Por solicitud:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

Para mí, la tabulación en el control selecciona todo el texto.

MagicKat
fuente
Su solución es similar a la solución de Jakub. Funciona para hacer clic. ¿Puede funcionar al tabular en el cuadro de texto? (Por ejemplo, al tabular en la barra de direcciones de su navegador también se seleccionará todo el texto.)
Judah Gabriel Himango
Sí, también funciona para tabulación. Escribí una aplicación de prueba y esta es la forma en que la hice funcionar.
MagicKat
No parece funcionar para tabulación. ¿Puedes mostrarnos el código que funciona para tabular?
Judá Gabriel Himango
3

Aquí hay una función auxiliar que lleva la solución al siguiente nivel: reutilizar sin herencia.

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

Para usar esto, simplemente llame a la función que pasa un TextBox y se ocupará de todos los bits desordenados por usted. Sugiero conectar todos sus cuadros de texto en el evento Form_Load. Puede colocar esta función en su formulario, o si lo desea, en algún lugar de una clase de utilidad para una reutilización aún mayor.

Ross K.
fuente
2

Esto funcionó para un cuadro de texto WPF / XAML.

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }
vagos
fuente
2

Esto es similar a la respuesta popular de nzhenry , pero me resulta más fácil no tener que subclasificar:

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub
Chris
fuente
1

SelectAll nunca funcionó para mí.

Esto funciona.

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;
Adam Bruss
fuente
Eso no tiene en cuenta el caso en el que enfocarse en el cuadro de texto. También exhibe algunos de los otros problemas discutidos en este hilo.
Judá Gabriel Himango
1

He encontrado una solución aún más simple:

Para asegurarse de que todo el texto esté seleccionado al hacer clic en un cuadro de texto, asegúrese de que el controlador Click llame al controlador Enter. ¡No hay necesidad de variables adicionales!

Ejemplo:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }
Pieter Heemeryck
fuente
Esto no funciona para el enfoque mediante la tabulación en el control, ¿verdad? Además, ¿qué pasa cuando desea seleccionar un texto sin seleccionar todo?
Judá Gabriel Himango
En realidad, ¡funciona con pestañas! Lo acabo de probar en un proyecto ficticio con MS Visual C # 2010. Lo molesto de esta solución es que no puede seleccionar texto sin seleccionar todo. Si quiere hacer eso, no se necesita ningún código, por supuesto, puede usar su mouse y seleccionarlo (o usar el teclado).
Pieter Heemeryck
Y es por eso que esta solución no resuelve el problema presentado: no se comporta como el cuadro de dirección del navegador, porque no puede hacer clic en partes individuales de la dirección sin que seleccione todo el texto.
Judá Gabriel Himango
Ok, entiendo lo que quieres decir. El título de la pregunta y el ejemplo de la barra de direcciones del navegador web no indicaron que debería poder seleccionar alguna parte del texto. Solo mencionaste esto como un lado en la última oración de tu pregunta. Saludos.
Pieter Heemeryck
0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}
Nescio
fuente
Acabo de probar con un RichTextBox. No funciona Al hacer clic en el cuadro de texto no parece seleccionar todo el texto. (Debido a que se está deseleccionando con el mouse hacia abajo, cuando el cursor se coloca en el cursor.)
Judah Gabriel Himango
0

Curiosamente, creo que un ComboBox con DropDownStyle = Simple tiene exactamente el comportamiento que estás buscando.

(Si reduce la altura del control para no mostrar la lista, y luego en un par de píxeles más, no hay una diferencia efectiva entre ComboBox y TextBox).


fuente
Interesante, pero realmente necesito esto para trabajar en TextBox y RichTextBox.
Judá Gabriel Himango
0

¿Por qué no simplemente usa el evento MouseDown-Event del cuadro de texto? Funciona bien para mí y no necesita un booleano adicional. Muy limpio y simple, por ejemplo:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

fuente
No, un par de problemas con esto: no tiene en cuenta si el cuadro de texto ya tiene foco (no queremos seleccionar todos los mouse hacia abajo, justo cuando el cuadro de texto no tenía foco), no le permite seleccionar solo una parte del texto, no funciona cuando se enfoca mediante tabulación al cuadro de texto.
Judá Gabriel Himango
0

Llamé a SelectAll dentro del evento MouseUp y funcionó bien para mí.

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }
Sreejith K.
fuente
Sí, vea las otras respuestas (y comentarios) sobre por qué esto no funciona en todos los escenarios.
Judá Gabriel Himango
No busqué la pestaña para esta solución. Culpa mía. Gracias por señalarlo. Me alegra ver que tiene la solución completa ahora. Y también me alegra saber que mi sugerencia para MouseUp se incluyó en su solución.
Sreejith K.
0

Simplemente deriva una clase de TextBox o MaskedTextBox:

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

Y úsalo en tus formularios.

Mohammad Mahdipour
fuente
Esto no funciona Para entender por qué, vea las otras respuestas y comentarios.
Judá Gabriel Himango
0

En realidad, GotFocus es el evento correcto (mensaje realmente) en el que está interesado, ya que no importa cómo llegue al control, eventualmente lo obtendrá. La pregunta es cuándo llamas a SelectAll ().

Prueba esto:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}
Peter Mortensen
fuente
Ali, esto no funciona. Intenta pasar el mouse por la mitad del texto. Mantenga presionado el botón del mouse durante 1 segundo.
Judá Gabriel Himango
0

Para un grupo de cuadros de texto en un formulario:

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}
Yfiua
fuente
1
Esto no funciona correctamente; vea mis respuestas a las otras respuestas que sugieren .SelectAll (). No funciona porque si ingresa al cuadro de texto mientras intenta seleccionar texto, rompe su selección de texto seleccionando todo el texto. Solo desea seleccionar texto si el foco ingresó al cuadro de texto con el mouse hacia arriba o presionándolo, pero si el foco fue causado por el mouse hacia abajo.
Judá Gabriel Himango
0

Sé que esto ya se resolvió, pero tengo una sugerencia que creo que es bastante simple.

En el caso del mouse up todo lo que tienes que hacer es colocar

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

Parece que me funciona en VB.NET (sé que esta es una pregunta de C # ... lamentablemente me veo obligado a usar VB en mi trabajo ... y estaba teniendo este problema, que es lo que me trajo aquí ... )

Todavía no he encontrado ningún problema con él ... excepto por el hecho de que no se selecciona inmediatamente al hacer clic, pero estaba teniendo problemas con eso ...

Eluem
fuente
1
La solicitud original quería que esto funcionara también cuando se tabula en el campo.
Don Kirkby el
2
Sí, esto no funciona para todos los escenarios. Solo funciona cuando haces clic en el cuadro de texto. E incluso entonces, si no se comporta como lo hace una barra de direcciones del navegador cuando la selección ya existe en el cuadro de texto.
Judá Gabriel Himango
0

La siguiente solución me funciona. Agregué OnKeyDowny OnKeyUpanulación de eventos para mantener el texto TextBox siempre seleccionado.

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}
abrfra
fuente
2
¿Le permite mover el mouse hacia abajo en el cuadro de texto, arrastrar el cursor para seleccionar texto y luego mover el mouse hacia arriba?
Judá Gabriel Himango
0

Establezca la selección cuando abandone el control. Estará allí cuando vuelvas. Pestaña alrededor del formulario y cuando regrese al control, se seleccionará todo el texto.

Si entra con el mouse, el cursor se colocará correctamente en el punto donde hizo clic.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }
Joel
fuente
Si entra con el mouse, debe seleccionar todo el texto, a menos que ya esté enfocado. Esto no es compatible con eso.
Judá Gabriel Himango
0

Solución muy simple:

    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;
        }
    }

EDITAR: OP original estaba particularmente preocupado por la secuencia de mouse-down / text-selection / mouse-up, en cuyo caso la solución simple anterior terminaría con una selección parcial del texto.

Esto debería resolver * el problema (en la práctica intercepto 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 );
    }

* En realidad, la siguiente secuencia termina con una selección de texto parcial, pero si mueve el mouse sobre el cuadro de texto, todo el texto se volverá a seleccionar:

mouse-down / text-selection / mouse-move-out-out-textbox / mouse-up

Mauro Sampietro
fuente
Esta solución ya fue publicada. Vea el comentario a la respuesta existente para descubrir por qué no funciona.
Judá Gabriel Himango
funciona con pestañas y con mouse, puede enfocar, seleccionar texto y luego mover el mouse hacia arriba. Parece que no puedo encontrar el problema con esto. ¿Puedes señalar eso?
Mauro Sampietro
0

Me parece que funciona mejor cuando hago clic con el mouse y no lo suelto inmediatamente:

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }
usuario3729779
fuente
0

Mi solución es bastante primitiva pero funciona bien para mi propósito

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}
BlueWizard
fuente
No funciona cuando desea mover el mouse hacia abajo para seleccionar un montón de texto, arrastrar el mouse y luego hacia arriba. Su código borrará la selección y seleccionará todo.
Judá Gabriel Himango
@JudahHimango Jup. Si hace un solo clic, seleccionará todo. Si hace clic y arrastra, seleccionará solo la selección. Al menos la barra del navegador en Firefox muestra exactamente este comportamiento.
BlueWizard
¿No es una condición de carrera, sin embargo? Si logro seleccionar rápidamente un texto con el mouse, el .SelectAll () disparará milisegundos más tarde, sobrescribiendo mi selección.
Judá Gabriel Himango
1
Ok, si eres rápido en la selección de cosas, esta cosa funcionará en tu contra.
BlueWizard
-1

Lo siguiente parece funcionar. El evento enter maneja las pestañas del control y MouseDown funciona cuando se hace clic en el control.

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }
benPearce
fuente
Sin suerte, no funciona, me temo. Intenta seleccionar algo de texto. El texto .SelectAll sobrescribe lo que el usuario está intentando seleccionar.
Judá Gabriel Himango
-1

La respuesta puede ser en realidad bastante más simple que TODAS las anteriores, por ejemplo (en WPF):

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

por supuesto, no puedo saber cómo quiere usar este código, pero la parte principal a considerar aquí es: Primero llame a .Focus () y luego llame a .SelectAll ();

MDB
fuente
Esto no funciona y es un duplicado de otras respuestas. Por ejemplo, si mueve el mouse hacia abajo en el cuadro de texto, arrastre, debe seleccionar parte del texto. Esto rompe eso y no selecciona todo.
Judá Gabriel Himango
-1

solo use selectall () en los eventos enter y haga clic

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }
EKanadily
fuente
Eso funciona hasta que quieras seleccionar algún texto. Vea las otras respuestas para una explicación completa.
Judá Gabriel Himango
-1

Creé un nuevo proyecto VB.Net Wpf. Creé un TextBox y usé lo siguiente para el código detrás:

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
BSalita
fuente