在网格中,如何设置文本块的宽度

时间:2012-02-29 16:33:52

标签: wpf

我有一个Grid,有两列,这里是定义。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="180"></ColumnDefinition>
        <ColumnDefinition Width="auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>   
    <TextBlock Name="nText" Text="{Binding Name}" Grid.Column="0" />
    <TextBlock Name="vText" Text="{Binding Value}" Grid.Column="1" HorizontalAlignment="Left" TextWrapping="Wrap"/>
</Grid>

我的问题是,对于vText,当Text太长时,无论columndefinition width是auto还是*,都无法包装文本。但是如果我将一个定义的值设置为第2列的宽度或vText的宽度,文本将被包装。

如何设置文本块的宽度以便可以包装文本内容?

我试图绑定到columnDefinition的width / ActualWidth,但也失败了。

非常感谢。

2 个答案:

答案 0 :(得分:1)

详细说明BalamBalam的答案,改变

<ColumnDefinition Width="auto"></ColumnDefinition>

<ColumnDefinition Width="*"></ColumnDefinition>

将执行您想要的操作,因为"auto"模式希望根据子元素推断其大小。在这种情况下,您的TextBlock没有定义宽度,因此ColumnDefinition无法推断宽度。

由于ColumnDefinition和TextBlock都没有定义宽度,因此TextBlock的宽度将默认为无限,并且自动换行算法将永远不会剪切文本。

相比之下,"*"表示填充剩余空间,该空间将由网格定义(如果在其上设置宽度)或其父项之一。最坏的情况是,"*"将能够在顶层找到一个值,因为窗口始终设置了宽度/高度。

希望这能更好地说明布局引擎如何通过尺寸实现其魔力!

答案 1 :(得分:0)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="180"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Column="0" Grid.Row="0" Name="nText" Text="nText"/>
    <TextBlock Grid.Column="1" Grid.Row="0" Name="vText" TextWrapping="Wrap">
        vText vTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvText
        vTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvText
        vTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvTextvText
    </TextBlock>
</Grid>