WPF TextBox выбирает все и показывает курсор одновременно

после долгих поисков в сети, надеюсь, вы мне поможете.

Моя проблема: я хочу выделить весь текст в TextBox и отобразить курсор (мигающий курсор) после последнего символа.

Я всегда находил информацию об одной проблеме или информацию, чтобы скрыть курсор.

По отдельности проблем нет, но их сочетание не работает.

// Set the focus to the TextBox
myTextBox.Focus();

// Select the complete text, but hide the caret (blinking cursor) 
myTextBox.SelectAll();

// or
// myTextBox.Select(0, myTextBox.Text.Length);

// Set the caret after the last character, but loss the selection from the text
myTextBox.CaretIndex = myTextBox.Text.Length;

Итак, я вижу каретку после последнего символа, но текст не выделен

myTextBox.Focus();
myTextBox.SelectAll();
myTextBox.CaretIndex = myTextBox.Text.Length;

Итак, текст выделен, но курсор не отображается.

myTextBox.Focus();
myTextBox.CaretIndex = myTextBox.Text.Length;
myTextBox.SelectAll();

И в этом проблема: один из них деактивирует другой, но мне нужны эти две вещи одновременно

Я использую WPF и .Net 4.0

Спасибо за помощь :-)


person Dark-Water    schedule 12.08.2014    source источник
comment
Есть веская причина, по которой курсор не отображается при выделении текста: ввод текста приведет к перезаписи выделенного текста (новые символы не появятся после выбора, что подразумевает наличие каретки). Однако, если вы должны это сделать, я считаю, что вам придется свернуть свою собственную каретку. Например, Настройка каретки текстового поля WPF.   -  person Scott Solmer    schedule 12.08.2014


Ответы (2)


Проблема заключается в сильной внутренней связи в TextBox между CaretIndex и Selection.

Каждый раз, когда вы изменяете выделение с помощью Select() или SelectAll(), TextBox автоматически помещает CaretIndex в начало выделения. И наоборот, TextBox очищает выбор, когда вы вручную изменяете CaretIndex. Вы можете сделать это поведение видимым, если зарегистрируетесь для SelectionChanged в TextBox и выведите текущий CaretIndex на Console.

На это есть серьезная причина, как уже упоминал Okuma.Scott в своем комментарии.

Поэтому, если желаемое поведение действительно требуется, вам, вероятно, потребуется реализовать свой собственный CustomTextBox.

person JanW    schedule 12.08.2014

Это сработало для меня:

        TextBox.Text = _Text;
        System.Windows.Input.Keyboard.Focus(TextBox);

        TextBox.GotFocus += (sender, e) => {
            if (_selectAll)
            {
                //I think Caret can be set here but I didn't try it
                TextBox.SelectAll();
            }
        };
person Ride Sun    schedule 17.11.2014