Когда текстовое поле C # WinForms получает фокус, я хочу, чтобы оно велось как адресная строка вашего браузера.
Чтобы понять, что я имею в виду, нажмите в адресной строке вашего браузера. Вы заметите следующее поведение:
- Нажатие в текстовом поле должно выделить весь текст, если текстовое поле не было предварительно сфокусировано.
- Мышь вниз и перетаскивание в текстовое поле должны выбрать только текст, который я выделил мышью.
- Если текстовое поле уже выделено, нажатие не выделяет весь текст.
- Фокусировка текстового поля программно или с помощью клавиатуры должна выделять весь текст.
Я хочу сделать именно это в WinForms.
САМОЕ БЫСТРОЕ ПРЕДУПРЕЖДЕНИЕ: пожалуйста, прочитайте следующее, прежде чем ответить! Спасибо, парни. :-)
Вызов .SelectAll () во время событий .Enter или .GotFocus не будет работать, потому что, если пользователь щелкнул текстовое поле, курсор будет размещен там, где он щелкнул, тем самым отменив выделение всего текста.
Вызов .SelectAll () во время события .Click не будет работать, потому что пользователь не сможет выделить текст мышью; вызов .SelectAll () будет перезаписывать выделение текста пользователем.
Вызов BeginInvoke ((Action) textbox.SelectAll) при вводе события focus / enter не работает, поскольку он нарушает правило № 2, приведенное выше, он будет переопределять выбор пользователя в фокусе.
источник
Ответы:
Прежде всего, спасибо за ответы! 9 всего ответов. Спасибо.
Плохая новость: все ответы имели некоторые причуды или работали не совсем правильно (или вообще). Я добавил комментарий к каждому из ваших постов.
Хорошие новости: я нашел способ заставить это работать. Это решение довольно простое и, похоже, работает во всех сценариях (наведение мыши, выбор текста, фокусировка на вкладках и т. Д.)
Насколько я могу судить, это приводит к тому, что текстовое поле ведет себя точно так же, как адресная строка веб-браузера.
Надеюсь, это поможет следующему парню, который пытается решить эту обманчиво простую проблему.
Еще раз спасибо, ребята, за все ваши ответы, которые помогли привести меня к правильному пути.
источник
alreadyFocused = true;
in MouseUp из оператора if. Потому что, если вы сразу выделите части текста, следующий щелчок снова выделит весь текст.Я нашел более простое решение для этого. Это включает в себя запуск SelectAll асинхронно с использованием,
Control.BeginInvoke
так что это происходит после того, как произошли события Enter и Click:В C #:
В VB.NET (спасибо Кришану Дей )
источник
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
не работает, как хотелось бы. Но все же самое короткое и элегантное решение :)Ваше решение хорошо, но не в одном конкретном случае. Если вы фокусируете TextBox, выбирая диапазон текста, а не просто щелкаете мышью, для флага Уже Фокусировано не устанавливается значение true, поэтому при повторном щелчке в текстовом поле весь текст выделяется.
Вот моя версия решения. Я также поместил код в класс, который наследует TextBox, поэтому логика скрыта.
источник
Это немного хитро, но в вашем событии клика, используйте
SendKeys.Send( "{HOME}+{END}" );
.источник
Нажмите событие текстового поля? Или даже событие MouseCaptureChanged работает для меня. - ХОРОШО. не работает
Таким образом, вы должны сделать 2 вещи:
Работает и для табуляции (через textBoxes к одному) - вызовите SelectAll () в Enter на всякий случай ...
источник
Ответ в одну строку, который я использую ... вы можете пнуть себя ...
В событии Enter:
txtFilter.BeginInvoke (новый MethodInvoker (txtFilter.SelectAll));
источник
Хорошо, после попытки вот что вы хотите:
Это выделило весь текст при вводе, но позволило мне выделить часть текста впоследствии или позволить выделить при первом щелчке.
По запросу:
Для меня вкладка в элемент управления выделяет весь текст.
источник
Вот вспомогательная функция, которая выводит решение на новый уровень - повторное использование без наследования.
Чтобы использовать это, просто вызовите функцию, передающую TextBox, и она позаботится обо всех ваших проблемах. Я предлагаю подключить все ваши текстовые поля в событии Form_Load. Вы можете разместить эту функцию в своей форме или, если хотите, как я, где-нибудь в служебном классе для еще большего повторного использования.
источник
Это сработало для текстового поля WPF / XAML.
источник
Это похоже на популярный ответ nzhenry , но мне легче не иметь подкласса:
источник
SelectAll никогда не работал для меня.
Это работает.
источник
Я нашел еще более простое решение:
Чтобы убедиться, что весь текст выделен при нажатии на текстовое поле, убедитесь, что обработчик Click вызывает обработчик Enter. Нет необходимости в дополнительных переменных!
Пример:
источник
источник
Интересно, что ComboBox с DropDownStyle = Simple имеет в точности то поведение, которое вы ищете, я думаю.
(Если вы уменьшите высоту элемента управления, чтобы список не отображался, а затем еще на пару пикселей, эффективная разница между ComboBox и TextBox отсутствует).
источник
Почему бы вам просто не использовать MouseDown-Event текстового поля? Он прекрасно работает для меня и не требует дополнительного логического значения. Очень чисто и просто, например:
источник
Я вызвал SelectAll внутри события MouseUp, и у меня все заработало.
источник
Просто выведите класс из TextBox или MaskedTextBox:
И используйте это на своих формах.
источник
Вы пробовали решение, предложенное на форуме MSDN "Windows Forms General", которое просто подклассы TextBox?
источник
На самом деле GotFocus - это правильное событие (действительно сообщение), которое вас интересует, так как независимо от того, как вы доберетесь до контроля, вы получите это даже в конце концов. Вопрос в том, когда вы вызываете SelectAll ().
Попробуй это:
источник
Для группы текстовых полей в форме:
источник
Я знаю, что это уже было решено, но у меня есть предположение, которое я считаю довольно простым.
В событии мыши вверх все, что вам нужно сделать, это поместить
Кажется, это работает для меня в VB.NET (я знаю, что это вопрос C # ... к сожалению, я вынужден использовать VB на своей работе ... и у меня была эта проблема, которая привела меня сюда ... )
Я не нашел никаких проблем с этим .. за исключением того факта, что он не сразу выбирается при нажатии, но у меня были проблемы с этим ....
источник
Следующее решение работает для меня. Я добавил
OnKeyDown
иOnKeyUp
переопределение событий, чтобы текст TextBox оставался всегда выделенным.источник
Установите выбор, когда вы покидаете контроль. Это будет там, когда ты вернешься. Нажмите на форму, и когда вы вернетесь к элементу управления, будет выделен весь текст.
Если вы нажмете мышкой, то каретка будет правильно размещена в том месте, где вы щелкнули.
источник
Очень простое решение:
РЕДАКТИРОВАТЬ: Оригинальный OP был особенно обеспокоен последовательностью мыши-вниз / выбора текста / мыши-вверх, и в этом случае вышеупомянутое простое решение закончилось бы с частичным выделением текста.
Это должно решить * проблему (на практике я перехватываю WM_SETCURSOR):
* На самом деле следующая последовательность заканчивается частичным выделением текста, но затем, если вы наведете курсор мыши на текстовое поле, весь текст будет выделен снова:
мышь-вниз / выделение текста / мышь-перемещение-текстовое поле / мышь-вверх
источник
Я считаю эту работу лучше всего, когда щелчок мышью не сразу отпущен:
источник
Мое решение довольно примитивно, но отлично работает для моих целей
источник
Ниже, кажется, работает. Событие enter обрабатывает вкладки для элемента управления, а MouseDown работает при нажатии на элемент управления.
источник
Ответ может быть на самом деле более простым, чем ВСЕ из вышеперечисленного, например (в WPF):
конечно, я не могу знать, как вы хотите использовать этот код, но основная часть, на которую стоит обратить внимание, это: сначала вызов .Focus (), а затем вызов .SelectAll ();
источник
просто используйте selectall () при вводе и клике по событиям
источник
Я создал новый проект VB.Net Wpf. Я создал один TextBox и использовал следующее для codebehind:
источник