Проверьте это:
<TextBox ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Width="300"
Height="200"
TextWrapping="Wrap"
AcceptsReturn="True"
FontSize="22pt"
Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
/>
Ключ здесь установлен TextWrapping="Wrap"
.Кроме того, если вы хотите создать новую строку с помощью клавиши ВВОД, установите AcceptsReturn="True"
.
Если полоса прокрутки не отображается для вас, возможно, ваши Width
и Height
нетне так "исправлено", как вы думали.Размер ScrollViewer
должен быть как-то ограничен.Убедитесь, что ваш TextBox
правильно расположен в своем контейнере.Например, вы можете временно установить его BorderThickness="5"
и посмотреть, не обрезано ли оно где-либо (это может быть в случае, если у вас есть HorizontalAlignment
/ VerticalAlignment
, кроме Stretch
).
РЕДАКТИРОВАНИЕ:
Как я уже говорил, для прокрутки TextBox
все зависит от значения свойства TextWrapping
.
Для TextBox
горизонтальная прокрутка из коробки имеет смысл только в том случае, если текст не обернут (имеется только одна очень длинная строка):
<TextBox ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
Width="300"
Height="200"
TextWrapping="NoWrap"
FontSize="22pt"
Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
/>
Если вы хотите иметь более одной строки текста для горизонтальной прокрутки, вам нужно явно обернуть TextBox
в ScrollViewer
и правильно задать размеры, чтобы ограничить содержимое ScrollViewer
:
<ScrollViewer
Width="200"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto">
<TextBox Name="txb1"
Width="500"
VerticalAlignment="Stretch"
TextWrapping="Wrap"
AcceptsReturn="True"
FontSize="22pt"
Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
/>
</ScrollViewer>
Полагаю, если вы хотите как-то "автоматически настроить" ширину TextBox
, вам нужно будет рассчитать ее при изменении текста.Способ сделать это с моей головы (возможно, есть лучшие решения):
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
txb1.Width = txb1.Text.Split('\n').Max(a =>a.Length) * approximatedCharWidth;
}
где approximatedCharWidth
Я использовал:
approximatedCharWidth = MeasureString(txb1, "lext").Width/4.0;
private Size MeasureString(TextBox textBlock, string candidate)
{
var formattedText = new FormattedText(
candidate,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch),
textBlock.FontSize,
Brushes.Black,
new NumberSubstitution(),
1);
return new Size(formattedText.Width, formattedText.Height);
}