Змушення програми WinForms TextBox поводиться як адресна панель браузера


154

Коли текстове поле C # WinForms отримує фокус, я хочу, щоб він поводився як адресний рядок вашого браузера.

Щоб побачити, що я маю на увазі, натисніть на адресному рядку веб-браузера. Ви помітите таку поведінку:

  1. Якщо натиснути в текстовому полі, слід вибрати весь текст, якщо текстове поле раніше не було зосереджено.
  2. Наведіть курсор миші та перетягніть її в текстовому полі, слід вибрати лише той текст, який я виділив мишкою.
  3. Якщо текстове поле вже орієнтоване, клацання не вибирає весь текст.
  4. Якщо фокусувати текстове поле програмно або через вкладку клавіатури, слід вибрати весь текст.

Я хочу зробити саме це в WinForms.

ШВИДКОГО СПІЛЬНОГО АВТОМОБІЛЮ: будь ласка, прочитайте наступне, перш ніж відповісти! Спасибі, хлопці. :-)

Виклик .SelectAll () під час подій .Enter або .GotFocus не працюватиме, оскільки якщо користувач натиснув текстове поле, карету буде розміщено там, де він натиснув, таким чином скасувавши вибір всього тексту.

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

Виклик BeginInvoke ((Action) textbox.SelectAll) на фокусування / введення події введення не працює, оскільки він порушує правило №2 вище, він буде продовжувати переосмислювати вибір користувача на фокус.


3
Поясніть, будь ласка, це для "RichTextBox".
Несіо

Nescio, це текстове поле чи багате текстове поле. Я спробував ваше рішення і в текстовому полі.
Іуда Габріель Хіманго

Це витік абстракції. Найкращий спосіб зробити це позначити WM_MOUSEACTIVATE і SelectAll на WM_SETFOCUS, якщо не WM_MOUSEACTIVATE-ing.
wqw

Відповіді:


109

Перш за все, дякую за відповіді! 9 загальних відповідей. Дякую.

Погана новина: всі відповіді мали певні химерності або не спрацювали цілком правильно (або взагалі). Я додав коментар до кожного Вашого допису.

Хороша новина: я знайшов спосіб змусити його працювати. Це рішення є досить простим і, здається, працює у всіх сценаріях (стикання, вибір тексту, фокусування вкладки тощо)

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

Наскільки я можу сказати, це призводить до того, що текстове поле поводиться точно так, як адресний рядок веб-браузера.

Сподіваємось, це допомагає наступному хлопцеві, який намагається вирішити цю оманливо просту проблему.

Ще раз дякую, хлопці, за всі ваші відповіді, які допомогли привести мене до правильного шляху.


Що робити, коли фокус програмно встановлений на TextBox? У мене є ця проблема, як обговорювалося тут: stackoverflow.com/questions/24790704/… Мені вдалося вирішити її після моди, але я все ще нервую це, оскільки моє “виправлення” здається досить неприємним.
Б. Клей Шеннон

Ви написали: "Виклик. ВибірAll () під час подій .Enter або .GotFocus не працюватиме, тому що якщо користувач натисне на текстове поле, карету буде розміщено там, де він натиснув, таким чином скасувавши вибір усього тексту". У мене є SelectAll у події GotFocus, яка здебільшого працює. Насправді, я вважаю, що курсор, розміщений там, де користувач натиснув, - це "добра справа". Я просто хочу, щоб він завжди був обраний, коли фокус встановлений на TextBox програмно.
Б. Клей Шеннон

І я знову тут! :)
dotNET

3
Ви повинні перемістити alreadyFocused = true;в MouseUp з if-оператора. Тому що якщо ви негайно виберете частини тексту, наступним клацанням знову виберіть весь текст.
Роберт С.

Нижче є відповідь на один вкладиш --- BeginInvoke ((Action) MyTextBox.SelectAll); --- Варто подивитися. Здається, зробити все необхідне
Генерал Грей

78

Я знайшов більш просте рішення цього. Він включає асинхронний відбір SelectAll, використовуючи Control.BeginInvokeтак, що це відбувається після того, як відбулися події Enter and 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();
    });
}

У VB.NET (спасибі Кришану Дей )

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

5
Найрозумніша відповідь, яку я коли-небудь знайшов .. Дякую велике .. Для VB.net Ось рішення ..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 'Найкраще рішення, така URL-адреса веб-браузера, багато класу End Class
ar.dll

7
У .Net 4.0 ви можете зробити: BeginInvoke ((Action) MyTextBox.SelectAll);
JoelFan

2
На жаль, BeginInvoke не працює для мене (безсумнівно, через мою катастрофічно запорошену версію Dot net). Попередження "Контроль". їй це не допомагає, ані попереджає назву самого TextBox. Поодинці і блідо люляючись ...
Б. Клей Шеннон

2
Зауважте, що це рішення поводиться не так, як описано в питанні. Зокрема Mouse down and drag in the textbox should select only the text I've highlighted with the mouse., не працює так, як бажано. Але все ж найкоротше та найелегантніше рішення :)
Маркус Мангельсдорф

30

Ваше рішення хороше, але не вдається в одному конкретному випадку. Якщо ви фокусуєте TextBox, вибираючи діапазон тексту, а не просто клацаючи, прапор, який вже був сфокусований, не встановлюється як істинний, тому при натисканні на 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;
        }
    }
}

2
+1 за пропозицію користувальницького текстового поля та ідеально працююче рішення!
Заправляється

Страхітливе рішення. Скопіював свій код прямо в моє рішення, змінив простір імен, щоб захистити невинних, і працював ідеально. Дякую!
kenswdev

8

Це трохи дивовижно, але в події клацання використовуйте SendKeys.Send( "{HOME}+{END}" );.


Вуофта! Це трохи хакерства! :-) Дякую за пропозицію. Якісь кращі ідеї?
Іуда Габріель Хіманго

Злом справді, але це зовсім не погано звучить
Террі

3
Вважайте, що багато антивірусних програм перехоплюють та блокують SEND KEYS як шкідливі. Це не чудове рішення.
Іуда Габріель Хіманго

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 на всякий випадок ...


Добре Якуб, це частково працює. Якщо я вкладу в текстове поле, його потрібно зосередити. Чи буде це працювати з вашим рішенням? (Якщо ви можете показати мені, як я, я
позначу

Якуб, тепер, коли ви опублікували код, він, здається, іноді спрацьовує. Не завжди; прямо зараз я клацаю в текстовому полі, і воно не вибирає всіх.
Іуда Габріель Хіманго

Іноді я натискаю текст, і він вибирає не все. Це як-небудь поле .f не встановлено таким, яким воно має бути, і тоді SelectAll не викликається. Ти цього не бачив?
Іуда Габріель Хіманго

Я знаю лише, що через mouseMouve можна повільно клацнути під час переміщення миші (особливо на широких літерах) -> зняти прапор. Ви можете видалити код у події mouseMove, але, ніж ви отримаєте - після tabbgin для управління, а потім натискання - reSelectAll - не вдалося вибрати частину переміщення при першому перетягуванні
Jakub Kotrla

4

Відповідь в одному рядку, який я використовую ... ви, можливо, б'єте себе ...

У події Enter:

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


1
Ні, не працює. Він вибирає весь текст добре, але також заважає користувачеві вибирати лише частину тексту, серед інших проблем.
Іуда Габріель Хіманго

Вибачте, я, мабуть, неправильно зрозумів поведінку, яку ви шукали. При введенні він вибирає всі, якщо натиснути і утримувати його, виберіть від початку до курсору. Я припускаю, що ви можете використовувати те, що я маю, і замінити SelectAll власною логікою вибору. notifywire.com/demos/2009-04-14_1248.swf

Чудово працює! Першим клацанням входить у вікно; потім натисніть і перетягніть, щоб вибрати текст.
D_Bester

Примітка: вона не працює як адресна панель веб-браузера. Адресна смужка веб-браузера дозволяє навести курсор миші в текстове поле і перетягнути / вибрати, навіть коли текстове поле ще не фокусується. Це рішення не вирішує цього. Якщо ви з цим все гаразд, класно, але це не відповідає вимогам цього питання.
Іуда Габріель Хіманго

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

Добре, спробувавши ось що ви хочете:

  • На події Enter запустіть прапор, який повідомляє, що ви були у події введення
  • Якщо ви встановите прапор, у події Click натисніть .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;
    }

Для мене вкладка в елементі управління вибирає весь текст.


Ваше рішення схоже на рішення Якуба. Він працює для клацання. Чи може це працювати при вкладці до текстового поля? (Наприклад, вкладка до адресного рядка веб-переглядача також вибере весь текст.)
Іуда Габріель Хіманго,

Так, це працює і для вкладки. Я написав тестовий додаток, і це було так, як я працював.
MagicKat

Схоже, це не працює для вкладки. Чи можете ви показати нам код, який працює для вкладки?
Іуда Габріель Хіманго

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. Ви можете розмістити цю функцію у своїй формі, або, якщо мені подобається, десь в класі корисності для ще більшого використання.


2

Це працювало для WPF / XAML TextBox.

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

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;

Це не враховує випадок, коли вкладка у текстове поле зосереджує увагу. Він також демонструє деякі інші проблеми, обговорені в цій темі.
Іуда Габріель Хіманго

1

Я знайшов ще простіше рішення:

Щоб переконатися, що весь текст обраний при натисканні на textBox, переконайтесь, що обробник клацань викликає обробник 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();
    }

Це не працює для фокусування через вкладку в управління, правда? Крім того, що робити, коли ви хочете вибрати якийсь текст, не вибираючи весь?
Іуда Габріель Хіманго

Насправді це працює з вкладкою в нього! Я щойно перевірив це в підробленому проекті, використовуючи MS Visual C # 2010. Прикро за цим рішенням, що ви не можете вибрати якийсь текст, не вибравши весь. Якщо ви хочете зробити саме це, звичайно, код не потрібен, ви можете просто скористатися мишкою та вибрати її (або за допомогою клавіатури).
Пітер Хемерік

І тому це рішення не вирішує представлену проблему: воно не поводиться як адресне поле браузера, оскільки ви не можете натиснути окремі частини адреси, не вибравши весь текст.
Іуда Габріель Хіманго

Гаразд, я бачу, що ти маєш на увазі. Заголовок питання та приклад адресного рядка веб-браузера не вказували, що ви повинні мати можливість вибрати частину тексту. Ви лише згадали про це як сторону в останньому реченні свого запитання. З повагою
Пітер Хемерік

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

Я щойно тестував на RichTextBox. Не працює. При натисканні на текстове поле не відображається весь текст. (Через те, що його
відміняють

0

Що цікаво, я думаю, що у ComboBox з DropDownStyle = Simple є майже така поведінка, яку ви шукаєте.

(Якщо ви зменшите висоту елемента керування, щоб не відображати список - а потім ще на пару пікселів - немає ефективної різниці між ComboBox та TextBox.)


Цікаво, але мені це дуже потрібно для роботи над TextBox та RichTextBox.
Іуда Габріель Хіманго

0

Чому ви просто не використовуєте MouseDown-Event у текстовому полі? Це добре працює для мене і не потребує додаткового булевого. Дуже чистий і простий, наприклад:

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

Ні, пари проблем з цим: не враховується, якщо в текстовому полі вже є фокус (ми не хочемо вибирати - всі миші вниз, просто тоді, коли в текстовому полі не було фокусу), не дозволяє вибрати просто частина тексту не працює, коли фокус здійснюється через вкладку до текстового поля.
Іуда Габріель Хіманго

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

Так, дивіться інші відповіді (та коментарі), чому це працює не у всіх сценаріях.
Іуда Габріель Хіманго

Я не перевіряв вкладку на це рішення. Моє ліжко. Дякуємо, що вказали. Радий бачити, що зараз у вас є повне рішення. А також рада знати, що моя пропозиція щодо MouseUp була включена у ваше рішення.
Sreejith K.

0

Просто виведіть клас із TextBox або MaskedTextBox:

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

І використовуйте це на своїх бланках.


Це не працює. Щоб зрозуміти чому, дивіться інші відповіді та коментарі.
Іуда Габріель Хіманго


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

Алі, це не працює. Спробуйте розплавитись в середині тексту. Утримуйте кнопку миші протягом 1 секунди.
Іуда Габріель Хіманго

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

1
Це не працює належним чином; дивіться мої відповіді на інші відповіді, які підказують .SelectAll (). Це не працює, оскільки якщо ви вводите текстове поле під час спроби виділення тексту, він порушує ваш вибір тексту, виділяючи весь текст. Вибираєте текст лише в тому випадку, якщо фокус увійшов у текстове поле за допомогою миші або вкладки до нього, але якщо фокус був викликаний мишею вниз.
Іуда Габріель Хіманго

0

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

У події миші все, що вам потрібно зробити, - це місце

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

Здається, це працює для мене у VB.NET (я знаю, це питання C # ... на жаль, я змушений використовувати VB на своїй роботі .. і у мене виникло це питання, і саме це мене привело сюди ... )

Я ще не знайшов жодних проблем з цим. За винятком того, що він не відразу вибирається при натисканні, але у мене були проблеми з цим ....


1
Оригінальний запит хотів, щоб це спрацювало і при вкладенні в поле.
Дон Кіркбі

2
Так, це працює не для всіх сценаріїв. Він працює лише при натисканні на текстове поле. І навіть тоді, якщо не веде себе так, як адресна панель браузера поводиться, коли виділення вже існує в текстовому полі.
Іуда Габріель Хіманго

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
Чи дозволяє вам мишати вниз у текстовому полі, перетягувати курсор, щоб вибрати текст, а потім мишкою вгору?
Іуда Габріель Хіманго

0

Встановіть сегмент, коли ви виходите з управління. Це буде там, коли ти повернешся. Вкладіть навколо форми, і коли ви повернетесь до елемента керування, весь текст буде обраний.

Якщо зайти мишкою, то карета буде правильно розміщена в точці, де ви натиснули.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.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;
        }
    }

Редагувати: Оригінал 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 );
    }

* Насправді наступна послідовність закінчується частковим вибором тексту, але тоді, якщо ви перемістите курсор миші на текстове поле, весь текст буде обраний знову:

миша вниз / виділення тексту / переміщення миші з тексту / миша вгору


Це рішення вже було розміщено. Перегляньте коментар до існуючої відповіді, щоб дізнатися, чому це не працює.
Іуда Габріель Хіманго

працює з вкладкою та за допомогою миші, ви можете отримати фокус, вибрати текст, а потім мишу вгору. Я не можу знайти проблему з цим. Чи можете ви, будь ласка, вказати на це?
Mauro Sampietro

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

Не працює, якщо ви хочете, щоб мишкою вибрати низ тексту, перетягнути мишу, а потім мишу вгору. Ваш код очистить вибір і все вибере.
Іуда Габріель Хіманго

@JudahHimango Jup Якщо ви клацнете одним клавішею миші, виберіть усе. Якщо натиснути та перетягнути його, виберемо лише вибір. Принаймні браузерна панель у Firefox показує саме таку поведінку.
BlueWizard

хіба це не умова гонки? Якщо мені вдасться швидко вибрати деякий текст мишкою, то .SelectAll () запуститься мілісекунди пізніше, замінивши мій вибір.
Іуда Габріель Хіманго

1
Гаразд, якщо ви швидше вибираєте речі, то ця річ буде працювати проти вас.
BlueWizard

-1

Нижче, здається, працює. Подія enter обробляє вкладку до елемента керування, а MouseDown працює при натисканні на елемент керування.

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

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

Не боюся, не працює, боюся. Спробуйте вибрати якийсь текст. Текст .SelectAll замінює те, що користувач намагається вибрати.
Іуда Габріель Хіманго

-1

Відповідь може бути насправді набагато простішою, ніж ВСЕ з вищезазначеного, наприклад (у WPF):

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

Звичайно, я не можу знати, як ви хочете використовувати цей код, але головна частина, на яку слід звернути увагу, - це: спочатку дзвоніть. Фокусуйте (), а потім зателефонуйте .SelectAll ();


Це не працює, і є дублікатом інших відповідей. Наприклад, якщо ви перетягуєте курсор миші в текстовому полі, він повинен вибрати частину тексту. Це порушує це і не вибирає всіх.
Іуда Габріель Хіманго

-1

просто використовуйте selectall () для подій Enter та click

private void textBox1_Enter(object sender, EventArgs e)
        {

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

Це працює, поки ви не захочете вибрати якийсь текст. Інші відповіді див. Для повного пояснення.
Іуда Габріель Хіманго

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.