Я новичок в WPF, и я столкнулся с проблемой, которая кажется немного сложной для решения. В принципе, я хочу, чтобы сетка 4x4 была масштабируемой, но сохраняла квадратное (или любое другое произвольное) соотношение сторон. Это на самом деле кажется довольно сложным, что меня удивляет, потому что я представляю себе его достаточно общее требование.
Я начинаю с определения Grid следующим образом:
<Grid>
<Grid.RowDefinitions>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
</Grid.ColumnDefinition>
...
</Grid>
Теперь, если вы установите растягивание, оно может заполнить Окно или любой другой контейнер, в который вы его помещаете. Строки и столбцы являются однородными, но соотношение сторон не фиксировано.
Затем я попытался поместить его в StackPanel, чтобы использовать доступное пространство. Не помогло. Что меня достало в основном из того, что было, когда я вспомнил Viewboxes.
<StackPanel Orientation="Horizontal">
<Viewbox>
<Grid Height="1000" Width="1000"> <!-- this locks aspect ratio -->
<Grid.RowDefinitions>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
<Grid.RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
<Grid.ColumnDefinition Width="*"/>
</Grid.ColumnDefinition>
...
</Grid>
</viewbox>
<Label HorizontalAlignment="Stretch">Extra Space</Label>
</StackPanel>
Теперь мой контент масштабируется и сохраняет пропорции. Проблема в том, что если окно недостаточно широко, некоторые мои сетки отключены от экрана. Я хотел бы иметь возможность прокручивать его, если это так. Аналогично, мне может потребоваться минимальный размер, который также может привести к вертикальной прокрутке.
Теперь я попытался поместить мой StackPanel и Grid (отдельно) в соответствующий контейнер ScrollViewer, но затем содержимое больше не масштабируется, чтобы соответствовать окну. Он идет в полный размер, что не хорошо.
Итак, как я могу это сделать? Я лаяю неправильное дерево? Есть ли лучший/более простой способ сделать это?