我有一个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,但也失败了。
非常感谢。
答案 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>