TextBox内容垂直拉伸到可用大小

时间:2016-06-23 08:53:30

标签: c# wpf xaml

我的目标是一个接受返回的TextBox,但只显示4行文本,这些文本与其他文本行对齐,但我有一些基本上似乎可以归结为问题的问题:什么是将session_start();的内容垂直拉伸到可用空间的正确方法吗?

最小的例子如下:

TextBox

但输出并非我的预期:

wrong streching example 1

我尝试设置<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="150" d:DesignWidth="150"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> </Grid.RowDefinitions> <Label Grid.Column="0" Grid.Row="0" Content="1" /> <Label Grid.Column="0" Grid.Row="1" Content="2" /> <Label Grid.Column="0" Grid.Row="2" Content="3" /> <Label Grid.Column="0" Grid.Row="3" Content="4" /> <TextBox Grid.Column="1" Grid.Row="0" Grid.RowSpan="4" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch" AcceptsReturn="True" MaxLines="4" Text="1&#13;2&#13;3&#13;4" /> </Grid> </Window> ,但它只是&#34;切断&#34;文字:

LineHeigt

wrong streching example 2

修改
<TextBox Grid.Column="1" Grid.Row="0" Grid.RowSpan="4" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch" AcceptsReturn="True" MaxLines="4" Text="1&#13;2&#13;3&#13;4" TextBlock.LineStackingStrategy="MaxHeight" TextBlock.LineHeight="18" VerticalScrollBarVisibility="Visible" /> 设置固定高度可以纠正行为,但这并不是解决问题的好方法。

2 个答案:

答案 0 :(得分:1)

您当前问题的直接原因是因为您使用的是Label而非TextBlock

这导致的问题是TextBox将行呈现为TextBlock,这是一个框架元素。鉴于Label是一个模板化控件,继承自ContentControl并且默认设置为Padding

因此,如果您希望它们在您的场景中对齐,您可以选择一些选项,例如;

遏制Label上的填充;

<Label Padding="0"/>

或者将它们换成好的旧TextBlock(顺便说一下,这是一个“更轻”的控件,而不是实际需要使用Label)。

或者您可以调整TextBox来反映Label的填充,方法是TextBlock定位附加属性,例如TextBlock.LineHeightTextBlock.LineStackingStrategy="BlockLineHeight"采取一些修改来获得你想要的确切输出。

另请注意 TextBox也是带有嵌入式ScrollViewer的模板化控件,因此默认BorderThickness

因此,如果我们做这样的事情,保留原始控制对,你会看到罪魁祸首作为例子;

<Grid ShowGridLines="True" 
      HorizontalAlignment="Center" VerticalAlignment="Center">
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="auto" />
         <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition Height="auto" />
         <RowDefinition Height="auto" />
         <RowDefinition Height="auto" />
         <RowDefinition Height="auto" />
      </Grid.RowDefinitions>

      <Label Content="1" Padding="0"/>
      <Label Grid.Row="1" Content="2" Padding="0"/>
      <Label Grid.Row="2" Content="3" Padding="0"/>
      <Label Grid.Row="3" Content="4" Padding="0"/>
      <TextBox BorderThickness="0" 
               Grid.Column="1" Grid.RowSpan="4" 
               VerticalAlignment="Top" 
               VerticalContentAlignment="Stretch" 
               AcceptsReturn="True" MaxLines="4" 
               Text="1&#10;2&#10;3&#10;4" />
</Grid>

给出结果;

enter image description here

希望这会有所帮助,欢呼。

答案 1 :(得分:0)

如果文本框位于vboxbox中,则可以将其拉伸,如下所示:

    <Viewbox Stretch="Uniform" Grid.Column="1" Grid.Row="0" Grid.RowSpan="4" >
        <TextBox Name="textBox" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" Text="1&#13;2&#13;3&#13;4"/>
    </Viewbox>

但在类似情况下,我想使用DataGrid