Как получить ширину столбцов WPF Grid ="*", но при этом иметь динамическую минимальную ширину, чтобы контент не обрезался
У меня есть 3 столбца в сетке wpf, который должен быть пропорциональным
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="Yellow"></Border>
<Border Grid.Column="2" Background="Yellow">
</Border>
<Border Grid.Column="1" Background="Green">
<Label Content="This is the Green Cell"></Label>
</Border>
</Grid>
Результат
Проблема в том, что текст в зеленой колонке обрезан. Я могу решить эту проблему, установив MinWidth = "150". Но содержимое зеленой колонки будет динамичным, поэтому я не могу использовать значение 150. Как я могу решить эту проблему?
2 ответа
Я думаю, что это делает то, что вы хотите: Label
насколько горизонтально выровнен внутри своей границы, поэтому он естественным образом изменяется в соответствии с тем, что он хочет, вместо того, чтобы простираться к его родителю. Я дал ему полупрозрачный фон, чтобы вы могли видеть, какую часть его родительского элемента он на самом деле занимает.
Затем мы связываем столбец 1 MinWidth
к ActualWidth
из Label
, Столбец 1 может быть настолько широким, насколько ему угодно, но он не может стать уже, чем Label
,
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition
Width="2*"
MinWidth="{Binding ActualWidth, ElementName=FixedContent}"
/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="Yellow" />
<Border Grid.Column="2" Background="Yellow" />
<Border Grid.Column="1" Background="Green">
<Label
x:Name="FixedContent"
HorizontalAlignment="Left"
Content="This is the Green Cell"
Background="#882266aa"
/>
</Border>
</Grid>
Если вы хотите обернуть текст, используйте TextBlock
вместо лейбла. Метка не поддерживает перенос текста.
<Border Grid.Column="1" Background="Green">
<TextBlock TextWrapping="Wrap" Text="This is the Green CellThis is the Green CellThis is the Green CellThis is the Green Cell"/>
</Border>