Одним из более простых решений (без учета измерения строк и вычисления полей, заполнения и т. Д. В преобразователе значений) является создание скрытого (не свернутого) 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
.Вы также можете использовать привязку, чтобы убедиться, что скрытый имеет тот же стиль, что и видимый.