Если я вызываю SelectAll
из GotFocus
обработчика событий, он не работает с мышью - выбор исчезает, как только мышь отпущена.
РЕДАКТИРОВАТЬ: Людям нравится ответ Доннелле, я постараюсь объяснить, почему он мне не понравился так же, как принятый ответ.
- Это более сложно, в то время как принятый ответ делает то же самое более простым способом.
- Удобство принятого ответа лучше. Когда вы щелкаете в середине текста, текст становится невыбранным, когда вы отпускаете мышь, позволяя мгновенно начать редактирование, и если вы все еще хотите выбрать все, просто нажмите кнопку еще раз, и на этот раз он не будет отменен при отпускании. Следуя рецепту Донеллы, если я нажму на середину текста, мне придется щелкнуть второй раз, чтобы иметь возможность редактировать. Если я щелкаю где-то внутри текста, а не за его пределами, это, скорее всего, означает, что я хочу начать редактирование, а не перезаписывать все.
.net
wpf
silverlight
textbox
Сергей Алдоухов
источник
источник
Ответы:
Не знаю, почему он теряет выбор в
GotFocus
случае.Но одним из решений является выбор
GotKeyboardFocus
иGotMouseCapture
события. Таким образом, это всегда будет работать.источник
У нас это так, первый щелчок выбирает все, а другой щелчок переходит к курсору (наше приложение предназначено для использования на планшетах с ручками).
Вы можете найти это полезным.
источник
SelectAllText
методеtextBox.IsFocused
улучшает его. Вы не хотите выбирать все, когдаGetKeyboardFocus
из-за alt-tabbing в программу.Ответ Доннелле работает лучше всего, но необходимость выучить новый класс для его использования - боль.
Вместо этого я регистрирую обработчики в App.xaml.cs для всех TextBoxes в приложении. Это позволяет мне использовать ответ Доннелле со стандартным элементом управления TextBox.
Добавьте следующие методы в ваш App.xaml.cs:
источник
Это довольно старый, но я все равно покажу свой ответ.
Я выбрал часть ответа Доннелла (пропустил двойной щелчок), потому что считаю его более естественным. Однако, как и gcores, мне не нравится необходимость создавать производный класс. Но мне также не нравится
OnStartup
метод gcores . И мне это нужно на «в общем, но не всегда».Я реализовал это как прикрепленный,
DependencyProperty
чтобы я мог установитьlocal:SelectTextOnFocus.Active = "True"
в xaml. Я считаю этот способ наиболее приятным.Для моей «общей, но не всегда» функции я установил это свойство Attache
True
в (глобальное)TextBox
Style
. Таким образом, «выбор текста» всегда «включен», но я могу отключить его для каждого текстового поля.источник
Вот варианты поведения Blend, реализующие решение для ответа:
Один для прикрепления к одному TextBox:
И один для присоединения к корню контейнера, содержащего несколько TextBox'ов:
источник
Хотя это старый вопрос, я только что столкнулся с этой проблемой, но решил ее, используя присоединенное поведение, а не поведение выражения, как в ответе Сергея. Это означает , что я не нужна зависимость от
System.Windows.Interactivity
в Бленд SDK:Затем вы можете использовать его в своем XAML следующим образом:
Я писал об этом здесь .
источник
Вот очень хорошее очень простое решение для MSDN :
Вот код позади:
источник
Я думаю, что это работает хорошо:
Если вы хотите реализовать его как метод расширения:
И в вашем
GotFocus
случае:Я обнаружил решение, описанное выше, потому что несколько месяцев назад я искал способ сфокусироваться на данном
UIElement
. Я обнаружил код ниже где-то (кредит предоставляется), и он работает хорошо. Я публикую его, хотя он не имеет прямого отношения к вопросу ОП, поскольку демонстрирует ту же модель использованияDispatcher
для работы с aUIElement
.источник
Вот попытка решить некоторые проблемы с другими решениями:
Код, который я написал, настраивается. Вы можете выбрать на какие действия выбрать все поведение должно происходить путем установки трех полей: только для чтения
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.Недостатком этого решения является то, что оно более сложное и статическое состояние сохраняется. Это кажется уродливой борьбой со стандартным поведением
TextBox
контроля. Тем не менее, это работает, и весь код скрыт в классе контейнера Attached Property.Чтобы прикрепить Attached Property к a
TextBox
, все, что вам нужно сделать, это добавить пространство имен xml (xmlns
) Attached Property, а затем использовать его следующим образом:Некоторые замечания об этом решении:
TextBox
помнит свой выбор после того, как теряет фокус. Я фактически переопределил это поведение.TextBox
(FirstActionIsMouseDown
статическое поле).ContextMenu
статическое поле).Единственный побочный эффект, который я обнаружил, это когда
SelectOnMouseRightClick
это правда. Иногда контекстное меню, вызываемое правой кнопкой мыши, мерцает, когда его открывают, а щелчок правой кнопкой мыши на пустом местеTextBox
не делает «выбрать все».источник
Я не нашел ни одного из представленных здесь ответов, имитирующих стандартное текстовое поле Windows. Например, попробуйте щелкнуть пробел между последним символом текстового поля и правой стороной текстового поля. Большинство решений здесь всегда будут выбирать весь контент, что очень затрудняет добавление текста в текстовое поле.
Ответ, который я здесь представляю, ведет себя лучше в этом отношении. Это поведение (поэтому требуется сборка System.Windows.Interactivity из Blend SDK ). Он также может быть переписан с использованием прикрепленных свойств.
Это основано на коде, который я нашел здесь .
источник
Эта простая реализация прекрасно работает для меня:
Чтобы применить его ко всем
TextBox
, поставьте следующий код послеInitializeComponent();
источник
В файле App.xaml:
В файле App.xaml.cs:
С этим кодом вы достигаете всего
TextBox
в вашем приложении.источник
Взято отсюда :
Зарегистрируйте глобальный обработчик событий в файле App.xaml.cs:
Тогда обработчик так же прост:
источник
Я понимаю, что это очень старо, но вот мое решение, которое основано на пространствах имен выражений / взаимодействия Microsoft и взаимодействий.
Сначала я следовал инструкциям по этой ссылке, чтобы поместить триггеры интерактивности в стиль.
Тогда это сводится к этому
и это
В моем случае, у меня есть пользовательский элемент управления, в котором находятся текстовые поля с выделенным кодом. Код позади имеет функцию-обработчик. Я дал своему пользовательскому элементу управления имя в XAML, и я использую это имя для элемента. Это работает отлично для меня. Просто примените стиль к любому месту,
TextBox
где вы хотели бы, чтобы весь текст был выделен при нажатии наTextBox
.Первый
CallMethodAction
вызывает метод текстового поля,SelectAll
когда происходитGotKeyboardFocus
событиеTextBox
.Надеюсь, это поможет.
источник
Я использовал ответ Нильса, но перешел на более гибкий.
В XAML вы можете использовать как один из них:
источник
Вот версия ответа на C #, опубликованная @Nasenbaer
тогда
MyTextBox_GotFocus
как обработчик события назначенGotFocus
событиюMyTextBox
.источник
У меня есть несколько упрощенный ответ для этого (только с
PreviewMouseLeftButtonDown
событием), который, кажется, имитирует обычную функциональность браузера:В XAML вы
TextBox
говорите:В коде позади:
источник
Попробуйте этот метод расширения, чтобы добавить желаемое поведение к любому элементу управления TextBox. Я еще не проверял это широко, но, кажется, он удовлетворяет мои потребности.
источник
Я много искал решение, я нашел пару решений, чтобы выбрать все. Но проблема в том, что когда мы щелкаем правой кнопкой мыши и делаем вырезание / копирование после выделения части текста из текстового поля, он выбирает все, даже если я выделил часть текста. Чтобы это исправить, вот решение. Просто добавьте приведенный ниже код в событие выбора клавиатуры. Это сработало для меня.
источник
У меня была такая же проблема. В VB.Net это так просто работает:
VB XAML:
Codehind:
C # (спасибо ViRuSTriNiTy)
источник
Это, безусловно, самое простое решение.
Добавить глобальный обработчик в приложение (App.xaml.cs) и готово. Вам понадобится всего несколько строк кода.
Поэтому используйте класс EventManager, чтобы зарегистрировать глобальный обработчик события для типа (TextBox). Фактический обработчик очень прост:
Проверьте здесь: WPF TextBox SelectAll on Focus
Надеюсь, поможет.
источник
Для тех, кто интересуется подходом Доннелла / Гроки, но хочет щелкнуть справа от последнего символа (но все еще внутри
TextBox
), чтобы поместить курсор в конце введенного текста, я предложил следующее решение:GetRoundedCharacterIndexFromPoint
Метод был взят из этого поста.источник
После поиска в Google и поиска я нашел простое решение, которое сработало для меня.
Вам нужно добавить обработчик событий в
Loaded
событие окна вашего контейнера:Далее необходимо создать обработчик, на который ссылается
RoutedEventHandler
предыдущий код:Теперь вы можете добавить
SelectAll()
команду дляGotFocus
обработчиков событийTextBox
отдельно для любых элементов управления:Ваш текст сейчас выделен в фокусе!
Адаптировано из решения Dr. WPF, форумов MSDN
источник
источник
Это, кажется, работает хорошо для меня. Это в основном резюме некоторых предыдущих постов. Я просто поместил это в мой файл MainWindow.xaml.cs в конструкторе. Я создаю два обработчика, один для клавиатуры и один для мыши, и объединяю оба события в одну и ту же функцию
HandleGotFocusEvent
, которая определяется сразу после конструктора в одном файле.источник
Простой способ переопределить mouseDown и выбрать все после двойного щелчка:
источник
Попробуйте поместить это в конструктор любого элемента управления, в котором находится ваше текстовое поле:
источник
Если есть событие, которое отменяет
OnFocus
выделение текста при наведении мыши, я обычно просто откладываю выделение всех.источник
Я проверил их все, но разработали только следующее:
источник
GetType().Name
вместоis
илиas
довольноЯ вижу, что есть много ответов, но как утвержденный, методы, которые следует использовать,
EditTextBoxGotCapture
со следующим кодом:
источник