39

我对 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>

现在,如果您将其设置为拉伸,它可以填充 Window 或您放入的任何容器。行和列是统一的,但纵横比不固定。

然后我尝试将其放入 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 容器中,但随后内容不再缩放以适应窗口。它变成全尺寸,这不好。

那么我该怎么做呢?我在吠叫错误的树吗?有没有更好/更简单的方法来做到这一点?

4

4 回答 4

78

您需要将内容(网格)放入Viewbox并将Viewbox.Stretch 属性设置为Stretch.Uniform

Viewbox 控件用于拉伸或缩放子元素,并允许您控制子元素的拉伸方式。在此处查看示例

替代文字
(来源:microsoft.com

于 2008-11-14T14:31:11.610 回答
5

在这种情况下,最好的选择是UniformGrid。这仅在您需要 NxN 网格时才有用。

于 2008-11-14T14:43:39.213 回答
-1

您需要SizeToContent="WidthAndHeight"在窗口上进行设置以提供您所追求的行为。

于 2008-11-14T07:16:38.023 回答
-4

为每个 Column 和 RowWidth 放置 0.25* 而不是 *

于 2008-11-14T04:54:51.833 回答