我需要显示文本 - 最多-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属性。
谢谢, 丹
答案 0 :(得分:4)
readonly无边框TextBox是否可以作为TextBlock使用?
<TextBox MinLines="2" MaxLines="2" IsReadOnly="True" BorderThickness="0"
VerticalScrollBarVisibility="Auto" Width="200" VerticalAlignment="Top" />
MinLines和MaxLines会限制文本框始终只有两行(除非您明确设置高度 - 如果在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中使用TextBlock
和Run
个元素) :
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
。您还可以使用绑定来确保隐藏的样式与可见的样式具有相同的样式。