文本换行会扩展列以适合文本

时间:2009-05-10 15:13:05

标签: wpf textwrapping

我简单地定义了一个网格:

<Grid Margin="0,5,0,0">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="48"></ColumnDefinition>
    <ColumnDefinition Width="Auto"></ColumnDefinition>
   </Grid.ColumnDefinitions>

然后我试图绑定一些像这样的内容:

<TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}">

像这样设置,文本不会换行。它只是扩展列以适合文本。如果我在最后一列上将宽度设置为固定量,则换行按预期工作。问题在于,如果用户加宽窗口,则列保持固定大小。如何使用网格的宽度动态调整列的大小,但仍然将文本包装在其中?

5 个答案:

答案 0 :(得分:5)

宽度"*"将使用"*"在列之间均匀分割任何剩余空间。如果您有一个包含Width="*"的列,则该列将获得所有剩余空间。如果您有2列Width="*",则每个列将获得剩余空间的1/2。

这是good article on grid sizing,其中包括星号大小。

答案 1 :(得分:5)

我发现有一个令人沮丧的案例可以使用Width="*"来实现收支平衡,当你有IsSharedSizeScope = true时就可以实现收支平衡。

<Border BorderBrush="Red" BorderThickness="1">
    <StackPanel Grid.IsSharedSizeScope="True">

        <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="G1"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="G2" />
                <ColumnDefinition Width="*"  SharedSizeGroup="G3" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="Col0" Grid.Column="0" Margin="0,0,5,0"/>
            <TextBlock Text="Col1" Grid.Column="1" Margin="0,0,5,0"/>

            <TextBlock Text="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" TextWrapping="Wrap" Grid.Column="2"/> 
        </Grid>

    </StackPanel>                   

</Border>

这不会换行,但是如果您将Grid.IsSharedScopeSize更改为false,那么它就会换行。

尚未找到解决方案,但这可能是其无效的另一个原因。

答案 2 :(得分:1)

试试这个:

<Grid Margin="0,5,0,0">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="50"></ColumnDefinition>
    <ColumnDefinition Width="48"></ColumnDefinition>
    <ColumnDefinition Name="ParentColumn" Width="Auto"></ColumnDefinition>
   </Grid.ColumnDefinitions>
   <TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}"
      MaxWidth="{Binding ActualWidth, ElementName=ParentColumn}">

答案 3 :(得分:-1)

将其宽度设置为“*”

答案 4 :(得分:-1)

如果希望列/行的大小取决于所述列/行中的内容,则应仅使用“自动”。如果你想“腾出空间”,请使用“*”。 在您的情况下,TextBlock需要知道在实际测量之前它有多少空间,因此它可以告诉文本的包装位置。