可滚动的TextBlock大小合适2行高

时间:2011-05-11 22:34:36

标签: wpf silverlight xaml

我需要显示文本 - 最多-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属性。

谢谢, 丹

2 个答案:

答案 0 :(得分:4)

readonly无边框TextBox是否可以作为TextBlock使用?

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

MinLinesMaxLines会限制文本框始终只有两行(除非您明确设置高度 - 如果在TextBox上显式设置了Height属性,则会忽略MaxLines和MinLines属性值)。

我看到这种方法的一个问题是TextBox的文本不会与其他文本块保持对齐(如果已将它们放在网格的同一列中)。

编辑:刚刚注意到你实际上想要一个文本块的边框。为此你可以摆脱BorderThickness =“0”部分。

答案 1 :(得分:1)

一个更简单的解决方案(没有进入测量字符串并计算值转换器中的边距,填充等)是为了使隐藏(不折叠)TextBlock只有你需要的线条数量很多将其ActualHeight绑定到可见TextBlock的{​​{1}}。用作度量的不可见MaxHeight必须将TextBlock设置为Visibility,这样即使未显示,它仍然是布局计算的一部分(Hidden会导致它完全消失了。)

这是一个演示,你可以投入到一个新项目中看它是否有效(我使用4行来使滚动条更容易使用)。

此部分取代Collapsed中的默认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添加了我想要的许多行(您也可以在XAML中使用TextBlockRun个元素) :

LineBreak

var limitString = "AgjZ"; limitString = limitString + Environment.NewLine + limitString + Environment.NewLine + limitString + Environment.NewLine + limitString; limiter.Text = limitString; 的{​​{1}}处理程序如下所示,因此您可以看到不同行数的效果:

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。您还可以使用绑定来确保隐藏的样式与可见的样式具有相同的样式。