Строки WPF UniformGrid и высота столбца одинаковой ширины - PullRequest
0 голосов
/ 19 февраля 2020

Мне нужна помощь с таблицей UniformGrid или Grid, как угодно.

Простая версия: У меня есть MainWindow только с 6 Rectangle, и они должны заполнить все мое MainWindow. Когда я изменяю размер окна, эти 6 прямоугольников должны иметь возможность изменять размеры и сохранять такую ​​же ширину и высоту, как и все остальные прямоугольники.

В конечном итоге мне нужно заменить свои прямоугольники фактическим контентом, таким как 6 воспроизводимых видео или 6 веб-браузеров, или 6 изображений и т. Д. c, все с той же шириной / высотой, так как размер окна изменяется с помощью user.

Вот прямоугольники.

enter image description here

Вот мой код XAML. Это не совсем работает, так как даже если я изменю размер MainWindow, все прямоугольники останутся «квадратами», они всегда имеют длину = ширину. Но мне нужны прямоугольники, иногда длина может быть больше ширины, так как размер окна изменяется пользователем так, как он хочет.

        <UniformGrid Rows="2" Columns="3">
            <Rectangle Stretch="UniformToFill" Fill="Black" />
            <Rectangle Stretch="UniformToFill" Fill="Blue" />
            <Rectangle Stretch="UniformToFill" Fill="Red" />
            <Rectangle Stretch="UniformToFill" Fill="Green" />
            <Rectangle Stretch="UniformToFill" Fill="Yellow" />
            <Rectangle Stretch="UniformToFill" Fill="Orange" />
        </UniformGrid>

Сложная версия: Мне в конечном итоге нужно разрешить пользователю для отображения 1, 2, 4 или 6 дисплеев, поэтому они должны занимать все окно с шириной / высотой.

Вот как бы это выглядело, если бы отображалось 2 дисплея. (когда пользователь изменяет размер окна так, чтобы длина> ширина)

enter image description here

1 Ответ

1 голос
/ 19 февраля 2020

Сетка дает вам такое поведение при изменении размера, если вы определяете столбцы и строки со звездообразным размером, который используется по умолчанию. Вместо того, чтобы писать, например, <RowDefinition Height="*"/>, вы можете просто написать <RowDefinition/>.

Итак, это должно работать:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition/>
    <ColumnDefinition/>
  </Grid.ColumnDefinitions>
  <Rectangle Grid.Row="0" Fill="Black" />
  <Rectangle Grid.Column="1" Fill="Blue" />
  <Rectangle Grid.Column="2" Fill="Red" />
  <Rectangle Grid.Row="1" Fill="Green" />
  <Rectangle Grid.Row="1" Grid.Column="1" Fill="Yellow" />
  <Rectangle Grid.Row="1" Grid.Column="2" Fill="Orange" />
</Grid>

Для сложного случая вам нужно настроить сетку RowDefinitions и ColumnDefinitions на основе элементов, которые вы вставили в Grid, и на основе размера окна, если вы хотите создать столбцы или строки. Вы можете установить все из Codebehind в Grid.

Дать ему имя в Xaml и использовать в Codebehind, например, grid.RowDefinitions.Add(...);

Добавить или удалить элементы в Codebehind с помощью grid.Children.Add(...);

Установите Grid.Row и Grid.Column в Codebehind с помощью методов c Grid.SetRow и Grid.SetColumn

...