Search code examples
.netwpfsilverlighttextbox

How to automatically select all text on focus in WPF TextBox?


If I call SelectAll from a GotFocus event handler, it doesn't work with the mouse - the selection disappears as soon as mouse is released.

EDIT: People are liking Donnelle's answer, I'll try to explain why I did not like it as much as the accepted answer.

  • It is more complex, while the accepted answer does the same thing in a simpler way.
  • The usability of accepted answer is better. When you click in the middle of the text, text gets unselected when you release the mouse allowing you to start editing instantly, and if you still want to select all, just press the button again and this time it will not unselect on release. Following Donelle's recipe, if I click in the middle of text, I have to click second time to be able to edit. If I click somewhere within the text versus outside of the text, this most probably means I want to start editing instead of overwriting everything.

Solution

  • Don't know why it loses the selection in the GotFocus event.

    But one solution is to do the selection on the GotKeyboardFocus and the GotMouseCapture events. That way it will always work.

    -- Edit --

    Adding an example here to show people how to work around some the mentioned drawbacks:

    private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        // Fixes issue when clicking cut/copy/paste in context menu
        if (textBox.SelectionLength == 0) 
            textBox.SelectAll();
    }
    
    private void TextBox_LostMouseCapture(object sender, MouseEventArgs e)
    {
        // If user highlights some text, don't override it
        if (textBox.SelectionLength == 0) 
            textBox.SelectAll();
    
        // further clicks will not select all
        textBox.LostMouseCapture -= TextBox_LostMouseCapture; 
    }
    
    private void TextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        // once we've left the TextBox, return the select all behavior
        textBox.LostMouseCapture += TextBox_LostMouseCapture;
    }