Я новичок в WPF и столкнулся с проблемой, которую немного сложно решить. В основном мне нужна масштабируемая сетка 4x4, но с квадратным (или любым другим произвольным) соотношением сторон. На самом деле это кажется довольно сложным, что меня удивляет, потому что я могу представить, что это достаточно распространенное требование.
Я начинаю с такого определения сетки:
<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, чтобы использовать доступное пространство. Не помогло. Больше всего меня поразило то, что я вспомнил о Viewbox.
<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, но тогда содержимое больше не масштабируется, чтобы соответствовать окну. Он идет в полный размер, что никуда не годится.
Итак, как мне это сделать? Я лаю не на то дерево? Есть ли лучший / более простой способ сделать это?





поместите 0,25 * вместо * для каждого столбца и ширины строки
Вам нужно установить SizeToContent = "WidthAndHeight" в окне, чтобы получить желаемое поведение.
Вам нужно поместить содержимое (сетку) в Окно просмотра и установить Свойство Viewbox.Stretch на Стрейч.униформа
Элемент управления Viewbox используется для растягивания или масштабирования дочернего элемента и позволяет вам контролировать способ растягивания дочернего элемента. Проверьте Примеры здесь.

(source: microsoft.com)
качество рендеринга дочернего элемента ужасное при использовании ViewBox
В этом случае лучше всего использовать UniformGrid. Это полезно, только если вам нужны сетки NxN.
не сохраняет соотношение сторон): просто растяните дочерние элементы одинаково
Есть ли способ закрепить рамку по краям равномерной растяжки?