如何文本在宽度自动列中包装TextBlock?

时间:2013-06-03 15:31:06

标签: wpf xaml silverlight textblock

考虑如下事项:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

此XAML将允许WrapTextBlock文本换行,执行此操作后,WrapTextBlock将占用所有空格并将NotWrapTextBlock推向右侧。

但我想做的是让WrapTextBlock占用尽可能少的空间,在NotWrapTextBlock之后推动WrapTextBlock,并在空白处填充右侧。

这意味着以下内容:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

但这里的问题是,现在WrapTextBlock中的文字不再包装了。

我的意思是如下:

当文字太长时,需要扭曲:

当文字足够短而不需要变形时:

1 个答案:

答案 0 :(得分:19)

原因是将ColumnDefinition定义为自动或*您无法限制TextBlock可供使用的大小。因此,文本的预期行为不会被包裹。因此,您必须直接在WidthMaxWidth上定义ColumnDefinitionTextBlock。所以例如;

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MaxWidth="50"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="WrapTextBlock" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
        <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
    </Grid>

如果你想说它只是允许它例如说,网格必须使用的空间的7%,将给你你的包裹,将Width改为类似的东西;

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="0.07*"/>
  <ColumnDefinition Width="0.93*"/>
</Grid.ColumnDefinitions>

因此,第一列将占用可用空间的7%,右列将消耗剩余的空间。希望这会有所帮助。

编辑添加:

你所展示的内容几乎与你的第一个列应该推送的第一个片段对齐,第二个列应该只允许其内容显示足够的空间;

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>