可滚动的TextBlock大小恰好为2行高度

6
我需要文本最多显示两行,不显示垂直滚动条,当超过两行时显示滚动条:
<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个回答

4
一个只读的无边框文本框是否可以作为 TextBlock 使用?
<TextBox MinLines="2" MaxLines="2" IsReadOnly="True" BorderThickness="0"
VerticalScrollBarVisibility="Auto" Width="200" VerticalAlignment="Top" />

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

我看到这种方法的一个问题是,如果将TextBox和其他TextBlock放在同一列的网格中,TextBox的文本将不会与其他文本块左对齐。

编辑:刚刚注意到您实际上想要为文本块添加边框。为此,您可以去掉BorderThickness =“0”部分。


谢谢,publicgk,太完美了。我还有另外两个TextBlock在同一个网格中,我也会改成TextBox,这样用户需要时就可以复制/粘贴。 - HoltDan

2

在不涉及测量字符串和计算边距、填充等值转换器的情况下,其中一个更简单的解决方案是创建一个隐藏(而非折叠)的TextBlock,该TextBlock只有你想要的行数,并将其ActualHeight绑定到可见TextBlockMaxHeight。用作测量的不可见TextBlock必须将其Visibility设置为Hidden,以便即使它不显示(Collapsed会导致其完全消失),它仍然是布局计算的一部分。

以下是一个演示,你可以将其放入新项目中以查看其工作原理(我使用4行以使滚动条更容易使用)。

这部分替换了Window内部的默认Grid

<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添加了任意行数的内容(你也可以在XAML中使用RunLineBreak元素):
var limitString = "AgjZ";
limitString = limitString + Environment.NewLine + limitString + Environment.NewLine + limitString + Environment.NewLine + limitString;
limiter.Text = limitString;

ButtonAddLine_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 和其他与字体相关的值。如果在可见的 TextBlockScrollViewer 上设置了任何内容,也需要在隐藏的 TextBlock 上进行设置。你还可以使用绑定确保隐藏的 TextBlock 与可见的那个具有相同的样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接