Прокручиваемый текстовый блок размером в 2 строки - PullRequest
5 голосов
/ 12 мая 2011

Мне нужен текст для отображения - максимум -2 строки - без видимой вертикальной прокрутки, а затем показать прокрутку, когда больше 2 строк:

<Border BorderBrush="Black" BorderThickness="1" Grid.Row="1" Grid.ColumnSpan="2">
    <ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="40">
        <TextBlock Text="{Binding RoadsString}" Style="{StaticResource WrapTextStyle}"/>
    </ScrollViewer>
</Border>

Я могу экспериментировать со значением MaxHeight до тех пор, пока оно не будет выглядеть правильно, но я бы предпочел, чтобы оно соответствовало любому заданному шрифту и ... точному. Желательно в XAML.

Могу ли я привязать MaxHeight к размеру шрифта? Или, может быть, свойство TextBlock, которое я не нашел.

Спасибо, Dan

Ответы [ 2 ]

4 голосов
/ 12 мая 2011

Будет ли работать только текстовый блок без полей для чтения в качестве текстового блока?

<TextBox MinLines="2" MaxLines="2" IsReadOnly="True" BorderThickness="0"
VerticalScrollBarVisibility="Auto" Width="200" VerticalAlignment="Top" />

MinLines и MaxLines будут ограничивать текстовое поле всегда двумя точками (кромеесли вы устанавливаете Высота явно - Если свойство Высота явно установлено в TextBox, значения свойств MaxLines и MinLines игнорируются).

Одна проблема, которую я вижу при таком подходе, заключается в том, что текст TextBox не останетсявыровнены с другими текстовыми блоками (если вы поместили их в тот же столбец сетки).

РЕДАКТИРОВАТЬ: только что заметил, что вы на самом деле хотите границы для вашего текстового блока.Для этого вы можете избавиться от BorderThickness = "0" part.

1 голос
/ 12 мая 2011

Одним из более простых решений (без учета измерения строк и вычисления полей, заполнения и т. Д. В преобразователе значений) является создание скрытого (не свернутого) TextBlock, которое имеет только столько строк, сколько вы хотите, и связывает его.ActualHeight до видимых TextBlock х MaxHeight.Невидимому TextBlock, используемому в качестве меры, должно быть присвоено значение Visibility, равное Hidden, чтобы оно оставалось частью вычислений макета, даже если оно не отображается (Collapsed приведет к его полному исчезновению).

Вот демонстрация, которую вы можете добавить в новый проект, чтобы увидеть, как он работает (я использую 4 строки, чтобы упростить использование полосы прокрутки).

Эта часть заменяет Grid по умолчанию внутри Window:

<Grid TextElement.FontSize="12">
    <TextBlock Name="limiter"
               HorizontalAlignment="Left"
               VerticalAlignment="Top"
               Width="100"
               Visibility="Hidden"
               Background="Gray">
    </TextBlock>
    <ScrollViewer MaxHeight="{Binding ElementName=limiter, Path=ActualHeight}"
                  Margin="40,0"
                  VerticalAlignment="Top"
                  HorizontalAlignment="Stretch"
                  Background="LightGray"
                  VerticalScrollBarVisibility="Auto">
        <TextBlock Name="vis" />
    </ScrollViewer>
    <Button Name="AddLine"
            Padding="8"
            VerticalAlignment="Bottom"
            HorizontalAlignment="Center"
            Click="AddLine_Click">Add A Line</Button>
</Grid>

В конструкторе Window я добавляю столько скрытых строк, сколько я хочу, к скрытым TextBlock (вы также можете использовать элементы Run и LineBreak в XAML):

var limitString = "AgjZ";
limitString = limitString + Environment.NewLine + limitString + Environment.NewLine + limitString + Environment.NewLine + limitString;
limiter.Text = limitString;

Обработчик Button AddLine_Click выглядит следующим образом, поэтому вы можете увидеть эффект с различным количеством строк:

private int counter = 0;
private void AddLine_Click( object sender, RoutedEventArgs e ) {
    var newline = string.Empty;
    if ( !string.IsNullOrWhiteSpace( vis.Text ) )
        newline = Environment.NewLine;
    vis.Text += string.Format( newline + "This is line #{0}.", ++counter );
}

Помните, что скрытый TextBlock должен находиться в той же области видимости, что и та, которую вы хотите показать, чтобы он наследовал FontSize и другие значения, связанные со шрифтами.Если что-то установлено на ScrollViewer или видимое TextBlock, оно также должно идти на скрытое TextBlock.Вы также можете использовать привязку, чтобы убедиться, что скрытый имеет тот же стиль, что и видимый.

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