Поместите курсор в конец всех текстовых полей

#c# #wpf #xaml

Вопрос:

РЕШЕНИЕ: Как указано в mm8 в комментариях, решение заключается в использовании ScrollToHorizontalOffset. Я заставил его работать, изменив ответ mm8, и вот рабочий код:

 inputTextBox.ScrollToHorizontalOffset(inputTextBox.GetRectFromCharacterIndex(inputTextBox.Text.Length).Right);
 

Это немного длинновато, но работает отлично!

У меня есть программа с двумя текстовыми полями:

 <TextBox x:Name="InputTextBlock" Grid.Row="1" Grid.Column="1" Margin="5,0,5,0"
      Text="{Binding FileToConvert, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  /> 

<TextBox x:Name="OutputTextBlock" Grid.Row="3" Grid.Column="1" Margin="5,0,5,0"
      Text="{Binding OutputFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

 

Когда одно из текстовых полей обновляется, второе тоже обновляется, но оба текстовых поля должны прокручиваться до конца вставленного текста. Это связано с тем, что иногда эти каталоги ввода/вывода могут быть очень длинными.

Я уже пытался получить эти два текстовых поля и отредактировать их свойства в коде следующим образом:

 ...
var inputTextBox = (System.Windows.Controls.TextBox) grid.GetElementByName("InputTextBlock");          
var outputTextBox = (System.Windows.Controls.TextBox) grid.GetElementByName("OutputTextBlock");

inputTextBox.Focus();
inputTextBox.Select(inputTextBox.Text.Length, 0);
inputTextBox.ScrollToEnd();

outputTextBox.Focus();
outputTextBox.Select(outputTextBox.Text.Length, 0);
outputTextBox.ScrollToEnd();

 

Но после этого только «позже» прокручивается до конца. Есть ли способ прокрутить эти два текстовых поля до конца?

Связанные текстовые поля ( FileToConvert и OutputFilePath ) обновляются с помощью кнопок и прочего.

Комментарии:

1. Почти уверен, что прокрутка-это не то, что вы ищете. Первый TextBox — это прокрутка назад к началу после потери фокуса. Вы пробовали установить выделение нулевой длины в конце текста? Вам придется установить SelectionStart и SelectionLength .

2. Привет! Да, я тоже пробовал использовать этот inputTextBox.SelectionStart = inputTextBox.Text.Length; inputTextBox.SelectionLength = 0; метод, и он не работает. Насколько я знаю, inputTextBox.Select(inputTextBox.Text.Length, 0); это должно быть одно и то же. я прав?

3. Я так думаю, да. Боюсь, у меня нет других предложений, но я надеюсь, что вы получите ответ!

4. Тем не менее, большое вам спасибо за ваше время!

Ответ №1:

Вы могли бы справиться с этим TextChanged событием следующим образом:

 void OnTextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.ScrollToHorizontalOffset(textBox.GetRectFromCharacterIndex(textBox.CaretIndex)
        .Right);
}

InputTextBlock.TextChanged  = OnTextChanged;
OutputTextBlock.TextChanged  = OnTextChanged;
 

Комментарии:

1. Привет! Спасибо вам за этот комментарий! Однако я получаю сообщение об ошибке: Argument 1: cannot convert from System.Windows.Rect to double

2. Еще раз привет! Я понял это, большое вам спасибо за это, после небольшой настройки вот рабочий фрагмент кода: inputTextBox.ScrollToHorizontalOffset(inputTextBox.GetRectFromCharacterIndex(inputTextBox.Text.Length).Right); теперь все, что мне нужно было сделать, это применить то же самое и к другому текстовому полю, и это работает! Спасибо!