Una de las soluciones más simples (sin entrar en la medición de las cadenas y el cálculo de márgenes, rellenos, etc. en un convertidor de valores) es hacer una oculta (no contraído) TextBlock
que sólo tiene sin embargo muchas líneas que desea y enlaza su ActualHeight
al TextBlock
visible MaxHeight
. El TextBlock
invisible utilizado como medida debe tener su Visibility
establecido en Hidden
, de modo que todavía forma parte de los cálculos de disposición, incluso si no se muestra (Collapsed
hará que desaparezca por completo).
Aquí hay una demostración que puede incluir en un nuevo proyecto para ver cómo funciona (utilizo 4 líneas para hacer que la barra de desplazamiento sea más fácil de usar).
Esta parte reemplaza el valor por defecto Grid
dentro del 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>
en el constructor del Window
's añado el embargo muchas líneas quiero a la TextBlock
oculta (también se puede utilizar Run
y LineBreak
elementos en el XAML):
var limitString = "AgjZ";
limitString = limitString + Environment.NewLine + limitString + Environment.NewLine + limitString + Environment.NewLine + limitString;
limiter.Text = limitString;
El Button
's AddLine_Click
manejador se parece a esto, para que pueda ver el efecto con diferentes números de líneas:
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);
}
Recuerde que los ocultos TextBlock
tiene que estar en más o menos el mismo alcance que el que usted quiere para mostrar para que herede FontSize
y otros valores relacionados con la fuente. Si hay algo configurado en ScrollViewer
o TextBlock
visible, también debe estar oculto en TextBlock
. También puede usar el enlace para asegurarse de que el oculto tenga el mismo estilo que el visible.
Gracias, publicgk, eso es PERFECTO. Tengo otros 2 TextBlocks en la misma grilla. También quiero cambiar a TextBox para que el usuario pueda copiar/pegar si es necesario. – HoltDan