Как получить ширину столбцов 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>
Другие вопросы по тегам