Установите позицию курсора / курсора в конец текстового поля WPF с строковым значением
Я пытаюсь установить позицию курсора / курсора в конце строкового значения в текстовом поле WPF, когда я открываю свое окно в первый раз. Я использую FocusManager, чтобы настроить фокус на моем текстовом поле, когда откроется мое окно.
Ничто не работает. Есть идеи?
Обратите внимание: я использую шаблон MVVM, и я включил только часть XAML из моего кода.
- Ошибка приложения при запуске из-за java.lang.IllegalArgumentException: column '_id' не существует
- Android: привязка данных из базы данных к CheckBox в ListView?
- Как получить позицию столбца каретки (не пикселей) в текстовом поле, в символах, с самого начала?
- Заполнение наборов результатов в MySQL
- использование курсора в android
- Каков наилучший способ повторить курсор Android?
- Как скрыть курсор в приложении Swing?
- Как получить позицию курсора в bash?
- Извлечение большого блоба из базы данных Android sqlite
- Перемещение курсора мыши программно
- Получение курсора браузера от «wait» до «auto» без перемещения пользователем мыши
- Как получить номер телефона для контактов в Android
- Android SimpleCursorAdapter не обновляется при изменении базы данных
Вы можете установить позицию каретки, используя свойство CaretIndex
TextBox
. Пожалуйста, имейте в виду, что это не DependencyProperty
. Тем не менее вы все равно можете установить его в XAML следующим образом:
Не забудьте установить CaretIndex
после свойства Text
иначе это не сработает. Таким образом, вероятно, это не сработает, если вы привяжетесь к Text
как в вашем примере. В этом случае просто используйте такой код.
NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
Вы также можете создать Поведение, которое, сохраняя при этом код, имеет то преимущество, что оно может использоваться повторно.
Пример простого classа поведения с использованием события фокуса текстового поля:
class PutCursorAtEndTextBoxBehavior: Behavior { private TextBox _textBox; protected override void OnAttached() { base.OnAttached(); _textBox = AssociatedObject as TextBox; if (_textBox == null) { return; } _textBox.GotFocus += TextBoxGotFocus; } protected override void OnDetaching() { if (_textBox == null) { return; } _textBox.GotFocus -= TextBoxGotFocus; base.OnDetaching(); } private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs) { _textBox.CaretIndex = _textBox.Text.Length; } }
Затем в вашем XAML вы присоединяете поведение так:
Если ваше текстовое поле (WinForms) является многострочным с вертикальной полосой прокрутки, вы можете попробовать следующее:
textbox1.Select(textbox1.Text.Length-1, 1); textbox1.ScrollToCaret();
Примечание. В WPF .ScrollToCaret () не является членом TextBox.
Это сработало для меня. Я также использую шаблон MVVM. Тем не менее, моя цель использования MMVM заключается в том, чтобы сделать модульное тестирование возможным и упростить обновление моего интерфейса (слабо связанного). Я не вижу, чтобы я тестировал позицию курсора, поэтому я не против прибегать к коду, стоящему за этой простой задачей.
public ExpeditingLogView() { InitializeComponent(); this.Loaded += (sender, args) => { Description.CaretIndex = Description.Text.Length; Description.ScrollToEnd(); Description.Focus(); }; }
В случае многострочного курсора установки TextBox
недостаточно. Попробуй это:
NumberOfDigits.ScrollToEnd();