#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);
теперь все, что мне нужно было сделать, это применить то же самое и к другому текстовому полю, и это работает! Спасибо!