Как TextWrap TextBlock в Auto Column ширины?

Рассмотрим что-то следующее:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

Этот XAML позволит WrapTextBlock текст WrapTextBlock, делая это, WrapTextBlock займет все пространство и толкнет NotWrapTextBlock вправо.

Но я хочу, чтобы WrapTextBlock занимал как можно меньше места, нажимая NotWrapTextBlock сразу после WrapTextBlock и заполняя правую сторону пустым пространством.

Что означает следующее:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>

Но дело в том, что теперь текст в WrapTextBlock больше не будет WrapTextBlock.

Я имею в виду что-то вроде следующего:

Когда текст слишком длинный, требуется деформация:

Когда текст достаточно короткий и не требует деформации:

Ответы

Ответ 1

Причина заключается в определении вашего ColumnDefinition как автоматического или * вам нечего ограничивать размер, доступный для вашего TextBlock, чтобы потреблять. Поэтому было бы ожидать, что текст для текста не будет обернут. Поэтому вам нужно будет определить Width или MaxWidth непосредственно в ColumnDefinition или TextBlock. Например,

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MaxWidth="50"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="WrapTextBlock" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
        <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
    </Grid>

Дает вам ваш обертку, если вы хотите сказать, вместо этого разрешите, например, сказать, что 7% пространства, которое должна использовать сетка, измените Width на что-то вроде:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="0.07*"/>
  <ColumnDefinition Width="0.93*"/>
</Grid.ColumnDefinitions>

Таким образом, первый столбец займет 7% доступного пространства, а правый столбец будет потреблять остальные. Надеюсь, это поможет.

Изменить дополнение:

То, что вы показываете в значительной степени, совпадает с вашим первым фрагментом, в который должен входить первый столбец, второй должен содержать только достаточное пространство для отображения его содержимого;

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="WrapTextBlock" Grid.Column="0" Text="123 456 789 0123 4456 123  123  123  123 1 23  123 " TextWrapping="Wrap" />
    <TextBlock x:Name="NotWrapTextBlock" Grid.Column="1" Text="GGG" />
</Grid>