【问题标题】:How to TextWrap a TextBlock within a width Auto Column?如何在宽度自动列内对 TextBlock 进行 TextWrap?
【发布时间】:2013-06-03 15:31:06
【问题描述】:

考虑如下:

<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 中的文本不会再换行了。

我的意思如下:

文本太长时需要变形:

当文本足够短且不需要变形时:

【问题讨论】:

    标签: wpf xaml silverlight textblock


    【解决方案1】:

    原因是通过将您的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% 的可用空间,而右列将占用剩余空间。希望这会有所帮助。

    编辑添加:

    您显示的内容与您的第一个 sn-p 几乎一致,其中第一列应该推动,第二列应该只允许足够的空间来显示其内容;

    <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>
    

    【讨论】:

    • 这我理解,但这限制了 WrapTextBlock 的列只能占用包含宽度。我不想看到的是 WrapTextBlock 和 NotWrapTextBlock 之间有空白。 NotWrapTextBlock 没有被推到最右边。
    • 听起来像是Grid 本身的考虑因素,如果它的空间比需要的多,它就会占用它。也许你想要的东西的快速图像,而不是你得到的东西将有助于定义它?
    • 在底部编辑,你的第一个 sn-p 应该按照你的想法做,前提是 Grid 本身有有限的空间来调用 TextWrapping
    • 我认为您的第一个答案不起作用 - MaxWidth 似乎没有换行。你试过这个吗?
    • @NathanPhillips 这是一个很老的答案,但 MaxWidth 应该几乎总是调用包装(当然前提是你有 TextWrapping=Wrap 集)。我不得不假设它是特定于您的场景的东西。如果您愿意,可以在另一个问题中分享详细信息,我们可以查看详细信息。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2011-09-18
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多