我简单地定义了一个网格:
<Grid Margin="0,5,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="48"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
然后我试图绑定一些像这样的内容:
<TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}">
像这样设置,文本不会换行。它只是扩展列以适合文本。如果我在最后一列上将宽度设置为固定量,则换行按预期工作。问题在于,如果用户加宽窗口,则列保持固定大小。如何使用网格的宽度动态调整列的大小,但仍然将文本包装在其中?
答案 0 :(得分:5)
宽度"*"
将使用"*"
在列之间均匀分割任何剩余空间。如果您有一个包含Width="*"
的列,则该列将获得所有剩余空间。如果您有2列Width="*"
,则每个列将获得剩余空间的1/2。
这是good article on grid sizing,其中包括星号大小。
答案 1 :(得分:5)
我发现有一个令人沮丧的案例可以使用Width="*"
来实现收支平衡,当你有IsSharedSizeScope
= true
时就可以实现收支平衡。
<Border BorderBrush="Red" BorderThickness="1">
<StackPanel Grid.IsSharedSizeScope="True">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="G1"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="G2" />
<ColumnDefinition Width="*" SharedSizeGroup="G3" />
</Grid.ColumnDefinitions>
<TextBlock Text="Col0" Grid.Column="0" Margin="0,0,5,0"/>
<TextBlock Text="Col1" Grid.Column="1" Margin="0,0,5,0"/>
<TextBlock Text="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" TextWrapping="Wrap" Grid.Column="2"/>
</Grid>
</StackPanel>
</Border>
这不会换行,但是如果您将Grid.IsSharedScopeSize
更改为false
,那么它就会换行。
尚未找到解决方案,但这可能是其无效的另一个原因。
答案 2 :(得分:1)
试试这个:
<Grid Margin="0,5,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="48"></ColumnDefinition>
<ColumnDefinition Name="ParentColumn" Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock TextWrapping="Wrap" Grid.Column="3" Text="{Binding Text}"
MaxWidth="{Binding ActualWidth, ElementName=ParentColumn}">
答案 3 :(得分:-1)
将其宽度设置为“*”
答案 4 :(得分:-1)
如果希望列/行的大小取决于所述列/行中的内容,则应仅使用“自动”。如果你想“腾出空间”,请使用“*”。 在您的情况下,TextBlock需要知道在实际测量之前它有多少空间,因此它可以告诉文本的包装位置。