2008-09-18 2 views
143

Когда текстовое поле C# WinForms получает фокус, я хочу, чтобы он вел себя как адресная строка вашего браузера.Создание WinForms TextBox ведет себя как адресная строка вашего браузера

Чтобы посмотреть, что я имею в виду, щелкните адресную строку вашего веб-браузера. Вы увидите следующее поведение:

  1. Нажав в текстовом поле, выберите весь текст, если текстовое поле ранее не было сфокусировано.
  2. Мышь вниз и перетаскивание в текстовое поле должны выбирать только текст, который я выделил с помощью мыши.
  3. Если текстовое поле уже сфокусировано, щелчок не отображает весь текст.
  4. Фокусировка текстового поля программно или с помощью клавиатуры, чтобы выбрать весь текст.

Я хочу сделать именно это в WinForms.

FASTEST GAR ALERT: перед тем, как ответить, прочитайте следующее. Спасибо, ребята. :-)

Вызов .SelectAll() во время событий Введите желанные или .GotFocus будет не работы, потому что если пользователь нажал на текстовое поле, каретка будет помещена , где он нажал, таким образом, Отмена выбора всех текст.

Вызов .SelectAll() во время события .Click не будет работать, потому что пользователь не сможет выбрать любой текст с помощью мыши; вызов .SelectAll() будет переписывать текст пользователя.

Вызов BeginInvoke ((Action) textbox.SelectAll) на фокус/ввести событие ввода не работает, поскольку она нарушает правила # 2 выше, он будет держать перекрывая выбор пользователя на фокус.

+3

Просьба пояснить это для «RichTextBox». – Nescio 2008-09-18 23:10:40

+0

Nescio, текстовое поле или богатое текстовое поле. Я попробовал ваше решение и в текстовом поле. – 2008-09-19 14:04:00

+0

Это утечка абстракции. Лучший способ сделать это - установить флаг WM_MOUSEACTIVATE и SelectAll на WM_SETFOCUS, если не WM_MOUSEACTIVATE-ing. – wqw 2010-01-30 16:02:13

ответ

101

Прежде всего, спасибо за ответы! 9 ответов. Спасибо.

Плохие новости: все ответы имели некоторые причуды или не работали совершенно правильно (или вообще). Я добавил комментарий к каждому из ваших сообщений.

Хорошие новости: я нашел способ заставить его работать. Это решение является довольно простым и, кажется, работает во всех сценариях (Mousing вниз, выбор текста, табулируя фокус и т.д.)

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

Насколько я могу судить, это приводит к текстовому полю вести себя так же, как паутина адресную строку браузера.

Надеюсь, это поможет следующему парню, который пытается решить эту обманчиво простую проблему.

Еще раз спасибо, ребята, за все ваши ответы, которые помогли привести меня к правильному пути.

4

Нажмите мероприятие из текстового поля? Или даже событие MouseCaptureChanged работает для меня. - ОК. не работает.

Так что вы должны сделать 2 вещи:

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

Работы для обхода (через Textboxes к одному), а также - вызов SelectAll() в Enter только в случае, если ...

+0

Ok Jakub, это частично работает. Если я перейду в текстовое поле, ему нужно сфокусироваться. Будет ли это работать с вашим решением? (Если вы можете показать мне, как я буду отмечать ваш ответ как правильный ответ.) – 2008-09-18 22:34:29

+0

Jakub, теперь, когда вы разместили код, кажется, что * иногда * работает. Не всегда; прямо сейчас я нажимаю в текстовое поле, и он не выбирает все. – 2008-09-19 13:48:37

+0

Не могли бы вы описать, когда это не сработает? – 2008-09-19 19:11:55

8

Это бит kludgey, но в событии клика используйте SendKeys.Send("{HOME}+{END}");.

+0

Woofta! Это немного хакерство! :-) Спасибо за предложение. Любые лучшие идеи? – 2008-09-18 22:27:55

+0

Взлом действительно, но это совсем не звучит – Terry 2010-04-30 13:06:37

+3

Учтите, что многие антивирусные программы перехватывают и блокируют SEND KEYS как вредоносные. Это не отличное решение. – 2010-09-23 14:43:20

3
'Inside the Enter event 
TextBox1.SelectAll(); 

Ok, после попытки его здесь то, что вы хотите:

  • На Enter события начинают флаг, который гласит, что вы были в случае заключения
  • на замковое случае, если вы установите флаг, вызовите .SelectAll() и сбросьте флаг.
  • В событии MouseMove установите для введенного флажка значение false, которое позволит вам щелкнуть выделение без необходимости ввода текстового поля.

Это выбрало весь текст для ввода, но позволил мне выделить часть текста после этого или позволить вам выделить первый клик.

По запросу:

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

Для меня, в табуляции управления выбирает весь текст.

+0

Ваше решение похоже на решение Jakub. Он работает для нажатия. Может ли он работать при вставке в текстовое поле? (Например, табуляция в адресную строку вашего браузера также выберет весь текст.) – 2008-09-18 22:36:01

+0

Да, это работает и для табуляции. Я написал тестовое приложение, и именно так я его и работал. – MagicKat 2008-09-18 22:53:40

+0

Кажется, что не работает для табуляции. Можете ли вы показать нам код, который работает для табуляции? – 2008-09-18 23:17:31

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(); 
    } 
} 
+0

Я только что проверил с RichTextBox. Не работает. При нажатии на текстовое поле не отображается весь текст. (Потому что он отбрасывается на мышь вниз, когда курсор помещается в курсор.) – 2008-09-18 23:07:00

0

Ниже показано, как работает. Событие ввода обрабатывает вкладку в элемент управления, а MouseDown работает при нажатии элемента управления.

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

    private void textBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (textBox1.Focused) 
      textBox1.SelectAll(); 
    } 
+0

Не повезло, не работает. Я боюсь. Попробуйте выбрать текст. Текст .SelectAll перезаписывает то, что пользователь пытается выбрать. – 2008-09-18 22:51:16

0

Интересно, что ComboBox с DropDownStyle = Simple имеет очень много именно поведение вы ищете, я думаю.

(Если уменьшить высоту элемента управления, чтобы не показывать список - а затем на пару пикселей больше - нет никакой принципиальной разницы между ComboBox и TextBox.)

+0

Интересно, но мне действительно нужно это для работы с TextBox и RichTextBox. – 2009-03-21 19:22:01

0

На самом деле GotFocus является правильным событием (сообщение действительно), которое вас интересует, так как независимо от того, как вы попадаете под контроль, вы получите это даже в конце концов. Вопрос в том, когда вы вызываете SelectAll().

Попробуйте это:

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(); 
    } 
} 
+0

Ali, это не работает. Попробуйте вымыться в середине текста. Удерживайте кнопку мыши в течение 1 секунды. – 2008-09-19 13:55:48

0

Почему бы вам просто не использовать MouseDown-Event текстового поля? Он отлично работает для меня и не нуждается в дополнительном логическом значении. Очень чистые и простой, например .:

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

Нет проблем с паролем с этим: не учитывается, если текстовое поле уже имеет фокус (мы не хотим выбирать - все мыши вниз, только когда текстовое поле не имеет фокуса), не позволяет вам выбирать просто часть текста, не работает, когда вы нажимаете фокус с помощью табуляции в текстовое поле. – 2008-11-22 19:32:22

4

А ответ на одну строку, которую я использую ... вы можете пинать себя ...

В Enter Event:

txtFilter.BeginInvoke (новый MethodInvoker (txtFilter.SelectAll));

+0

Нет, не работает. Он выбирает весь текст, хорошо, но он также не позволяет пользователю выбирать только часть текста, среди других проблем. – 2009-04-06 22:03:02

+0

Извините, я, должно быть, неправильно понял поведение, которое вы искали. При вводе он выбирает все, если вы нажмете и удерживаете его, выберите от начала до вашего курсора. Я полагаю, вы могли бы использовать то, что у меня есть, и заменить SelectAll своей собственной логикой выбора. http://www.notifywire.com/demos/2009-04-14_1248.swf – 2009-04-14 17:07:28

0

Я назвал SelectAll внутри события MouseUp, и он отлично работал для меня.

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); 
    } 
+0

Да, см. Другие ответы (и комментарии), почему это не работает во всех сценариях. – 2009-10-27 01:23:03

+0

Я не проверял вкладку для этого решения. Виноват. Спасибо за указание. Рад видеть, что у вас есть полное решение сейчас. И также приятно знать, что мое предложение для MouseUp было включено в ваше решение. – 2009-10-27 16:32:28

0

Просто получить класс от TextBox или MaskedTextBox:

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

И использовать его на ваших формах.

+0

Это не работает. Чтобы понять, почему, см. Другие ответы и комментарии. – 2010-01-06 16:48:34

-1

Я создал новый проект VB.Net Wpf. Я создал один TextBox и используется следующий за коде:

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 
29

Ваше решение хорошо, но не может в одном конкретном случае. Если вы даете фокус TextBox, выбирая диапазон текста, а не просто щелкнув, флаг ужеFocussed не получает значение true, поэтому при повторном щелчке в TextBox весь текст выбирается.

Это моя версия решения. Я также поместил код в класс, который наследует TextBox, поэтому логика красиво скрыта.

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

Для группы в текстовые поля формы:

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

Я нашел простое решение этой проблемы. Она включает в себя сбрасывая с SelectAll асинхронно с помощью Control.BeginInvoke так, что это происходит после того, как произошли Enter и нажмите события:

В C#:

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

В VB.NET (благодаря Krishanu Dey)

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub 
3

Вот вспомогательная функция, принимающая решение на следующий уровень - повторное использование без наследования.

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

Чтобы использовать это, просто вызовите функцию, передающую TextBox, и она позаботится обо всех беспорядочных битах для вас. Я предлагаю подключить все текстовые поля в событии Form_Load. Вы можете разместить эту функцию в своей форме или, если хотите, как я, где-нибудь в классе утилиты, для еще большего повторного использования.

0

Я знаю, что это уже было решено, но у меня есть предположение, что я считаю на самом деле довольно простым.

В случае мыши на все, что вы должны сделать, это место

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

Это, кажется, работает для меня в VB.NET (я знаю, что это C# вопрос ... к сожалению, я вынужден используйте VB на моей работе .. и у меня возникла эта проблема, и это привело меня сюда ...)

У меня пока не было проблем с этим, кроме факта, что он не сразу выберите по щелчку, но у меня были проблемы с этим ....

2

Это похоже на популярный ответ nzhenry, но я нахожу его легче не иметь подкласса:

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 
1

SelectAll никогда не работал для меня.

Это работает.

ActiveControl = textBox1; 
textBox1->SelectionStart = 0; 
textBox1->SelectionLength = textBox1->Text->Length; 
0

Следующее решение работает для меня. Я добавил OnKeyDown и OnKeyUp событие переопределить, чтобы текст TextBox всегда был выбран.

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

Это работало для текстового поля 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;  
    } 
0

Установите разрешение, когда вы покинете управление. Он будет там, когда вы вернетесь. Вкладка вокруг формы и когда вы вернетесь к элементу управления, будет выбран весь текст.

Если вы заходите мышью, то каретка по праву будет помещена в точку, где вы нажали.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e) 
    { 
     maskedTextBox1.SelectAll(); 
    } 
0

Ответ может быть на самом деле достаточно более простой, чем все выше, например (в WPF):

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

, конечно, я не могу знать, как вы хотите использовать этот код, но основная часть, чтобы посмотреть здесь: Первый вызов .Focus(), а затем вызов .SelectAll();

0

Очень простое решение:

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

EDIT: Оригинал О.П. был, в частности, обеспокоены/последовательности мыши вверх мыши вниз/текст отбора, в этом случае выше простое решение будет в конечном итоге с частично выбранным текстом.

Это должно решить * проблему (на практике я перехватывать 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); 
    } 

* На самом деле следующая последовательность заканчивается с частичным фрагментом текста, а затем, если вы переместите курсор в текстовом поле всего текст будет выбран снова:

мышь вниз/текст выбора/мышь-ход-из текстового поля/мышь вверх

1

Я нашел еще более простое решение:

Чтобы убедиться, что весь текст выбран при нажатии на текстовое поле, убедитесь, что обработчик Click вызывает обработчик Enter. Нет необходимости в дополнительных переменных!

Пример:

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(); 
    } 
0

просто использовать SelectAll() на входящих и нажмите событий

private void textBox1_Enter(object sender, EventArgs e) 
     { 

      textBox1.SelectAll(); 
     } 
     private void textBox1_Click(object sender, EventArgs e) 
     { 
      textBox1.SelectAll(); 
     } 
0

Я считаю эту работу лучше всего, когда клику мыши и не отпускайте сразу:

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

Мое решение довольно примитивное, но отлично работает для моих целей

private async void TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    if (sender is TextBox) 
    { 
     await Task.Delay(100); 
     (sender as TextBox).SelectAll(); 
    } 
} 
0

Это работает для меня.NET 2005 -

' * if the mouse button is down, do not run the select all. 
    If MouseButtons = Windows.Forms.MouseButtons.Left Then 
     Exit Sub 
    End If 

' * OTHERWISE INVOKE THE SELECT ALL AS DISCUSSED. 
Смежные вопросы