Как сохранить соотношение сторон на масштабируемом, прокручиваемом контенте в WPF?

Я новичок в 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, но затем содержимое больше не масштабируется, чтобы соответствовать окну. Он идет в полный размер, что не хорошо.

Итак, как я могу это сделать? Я лаяю неправильное дерево? Есть ли лучший/более простой способ сделать это?

Ответ 1

Вам нужно разместить содержимое (сетку) внутри ViewBox и установить Viewbox.Stretch Property - Stretch.Uniform

Элемент управления Viewbox используется для растягивания или масштабирования дочернего элемента и позволяет вам контролировать способ растяжения ребенка. Ознакомьтесь с здесь.

alt text http://i.msdn.microsoft.com/ms635549.img_mmgraphics_stretchenum(en-us,VS.90).jpg

Ответ 2

В этом случае лучший выбор - UniformGrid. Это полезно, только если вы хотите сетки NxN.

Ответ 3

Будет ли параметр SizeToContent = "WidthAndHeight" в окне дать вам поведение, которое вы после?

Ответ 4

положите 0,25 * вместо * для каждого столбца и строки RowWidth