如何在自动列宽中对TextBlock进行文本换行?

20

考虑以下内容:

<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文本自动换行,并使其占据所有空间并将NotWrapTextBlock推向右侧。

但是我想要的是让WrapTextBlock占用尽可能少的空间,紧随其后地推动NotWrapTextBlock,并在右侧填充空白。

也就是说:

<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个回答

24
定义ColumnDefinition为Auto或*会导致TextBlock可用的大小没有限制,这就是文本不换行的预期行为。因此,您需要在ColumnDefinitionTextBlock上直接定义WidthMaxWidth。例如:
<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>

1
我理解这一点,但是这会限制WrapTextBlock的列只能占用包含宽度的空间。我不想看到的是WrapTextBlock和NotWrapTextBlock之间有空白空间。而且NotWrapTextBlock没有被推到最右边。 - King Chan
如果Grid本身有比必要的空间还多,那么似乎需要考虑。也许一个展示想要的样子与实际得到的不同的快速图像会有所帮助? - Chris W.
不错的交易,很高兴你找到了解决方法。干杯! - Chris W.
2
我认为你的第一个答案不可行 - MaxWidth似乎不能换行文本。你试过这个了吗? - Nathan Phillips
1
@NathanPhillips 这是一个相当旧的答案,但是 MaxWidth 应该几乎总是调用换行(当然,前提是你已经设置了 TextWrapping=Wrap)。我必须假设这与您的情况有关。如果您愿意,在另一个问题中分享详细信息,我们可以查看详情。 - Chris W.
显示剩余6条评论

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