2011-05-11 6 views
5

necesito el texto que se mostrará - en la mayoría de las líneas -2 - sin desplazamiento vert visible, a continuación, mostrar el rollo cuando es mayor que 2 líneas:Scrollable TextBlock Sized exactamente 2 líneas de alta

<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> 

puedo experimentar con el valor de MaxHeight hasta que se vea bien, pero preferiría que se adapte a cualquier fuente que se especifique y ... precisa. Preferiblemente en XAML.

¿Puedo vincular MaxHeight al tamaño de fuente? O tal vez hay una propiedad TextBlock que no he encontrado.

Gracias, Dan

Respuesta

1

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.

4

¿Un TextBox sin texto funcionaría para usted como un TextBlock?

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

MinLines y MaxLines restringiría cuadro de texto para tener siempre exactamente dos líneas (excepto si se establece de manera explícita Altura - Si la propiedad Height se establece explícitamente en un cuadro de texto, los maxLines y valores de propiedad MinLines se ignoran).

Un problema que veo con este enfoque es que el texto del TextBox no se alineará con otros bloques de texto (si los ha colocado en la misma columna de una cuadrícula).

EDITAR: Acabo de darme cuenta de que realmente quiere un borde para su bloque de texto. Para eso puedes deshacerte de BorderThickness = "0" parte.

+0

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

Cuestiones relacionadas