WPF, XAML: растянуть, если доступное пространство меньше MinWidth (с изображениями) - PullRequest
1 голос
/ 20 июня 2019

У меня есть сетка с переменной шириной.Он содержит три столбца, два внешних служат переменными полями для содержимого, находящегося в среднем столбце.

Я хочу, чтобы сетка имела следующие свойства, связанные с размером:

  • Grid.Width> = 220px: ширина внешних столбцов = 10px (максимальная ширина) каждый, а средний столбец занимает оставшееся пространство
  • Grid.Width <= 200px: ширина внешних столбцов = 0px каждый и среднийСтолбец занимает всю сетку </li>
  • Между 200px и 220px внешние столбцы растут с 0px (при 200) до 10px (при 220) каждый.Между этими точками ширина среднего столбца остается 200px, так как внешним столбцам для изменения / уменьшения требуется измененная Grid.Width.

Я использовал этот код:

<ColumnDefinition Width="10*" MaxWidth="10" />
<ColumnDefinition Width="200*" MinWidth="200"/>
<ColumnDefinition Width="10*" MaxWidth="10" />

enter image description here

И это работает отлично, за исключением одной проблемы: если Ширина сетки меньше, чем MinWidth среднего столбца, столбец не меняет свою ширину, чтобы соответствовать ширине сетки, но остается 200px.Но если я удаляю свойство MinWidth, два внешних столбца не будут «растягиваться» до 0 пикселей, когда ширина сетки равна 200 пикселей.

Я хочу, чтобы средний столбец растягивался до ширины сетки, когда сетка меньшечем 200px. Что мне делать?

1 Ответ

0 голосов
/ 20 июня 2019

Конечно, средние столбцы остаются шириной 200 DIP, если вы установите для MinWidth значение 200. Это именно то, для чего используется свойство MinWidth.

Если вам нужно более настраиваемое поведение, вам следует реализовать его с использованием языка программирования, такого как C #. Например, вы можете обработать событие SizeChanged для Grid и скрыть внешние столбцы, если их ширина меньше 200 DIP. Примерно так:

private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Grid grid = (Grid)sender;
    if (e.NewSize.Width < 200)
    {
        grid.ColumnDefinitions[0].Width = new GridLength(0);
        grid.ColumnDefinitions[2].Width = new GridLength(0);
    }
    else
    {
        grid.ColumnDefinitions[0].Width = new GridLength(10, GridUnitType.Star);
        grid.ColumnDefinitions[2].Width = new GridLength(10, GridUnitType.Star);
    }
}

XAML:

<Grid SizeChanged="Grid_SizeChanged">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10*" MaxWidth="10" />
        <ColumnDefinition Width="200*" />
        <ColumnDefinition Width="10*" MaxWidth="10" />
    </Grid.ColumnDefinitions>
</Grid>
...