WPF Как сделать текстовое поле скользящим - PullRequest
0 голосов
/ 19 сентября 2019

Итак, у меня есть TextBox с фиксированной высотой и шириной.Я хочу, чтобы в TextBox был ползунок или что-то еще, чтобы сделать отсутствующий текст видимым.Под отсутствующим текстом я подразумеваю текст, который длиннее ширины текстового поля.Это не должен быть слайдер, просто что-то, что позволяет мне видеть вырезанный текст.

Я пытался:

<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Auto" />

, но это ничего не делает для меня.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Если у вас есть обычная строка без перевода строки, это может работать только для горизонтальной ИЛИ вертикальной прокрутки.

Если вы можете прокручивать по горизонтали, то вы говорите, что текст может быть настолько широким, насколько это возможно.нравится.Это означает, что вы получите одну строку.

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

Если вы этого не делаетекажется, что требуется вертикальная прокрутка Я попробовал это:

     <TextBox ScrollViewer.HorizontalScrollBarVisibility="Auto"
             Text="ABCDEFGIJKLMNOPQRSTUVWXYZ ABCDEFGIJKLMNOPQRSTUVWXYZ ABCDEFGIJKLMNOPQRSTUVWXYZ ABCDEFGIJKLMNOPQRSTUVWXYZ"
             Height="36"
             Width="200"
             />

Что дает:

A horizontal scrolling textbox

Что, кажется, то, что выпосле.

0 голосов
/ 19 сентября 2019

Проверьте это:

<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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...