如何在WPF中保持可缩放、可滚动内容的纵横比?

39

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

如果将其设置为stretch,它可以填充窗口或任何容器。行和列是均匀的,但长宽比不固定。

然后我尝试将其放入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个回答

80

3
有没有办法将帧锁定在均匀拉伸的边缘? - Jeff
使用ViewBox时,子元素的渲染质量很差。 - AmirHossein Rezaei

4

在这种情况下,您最好选择一个UniformGrid。如果您想要NxN网格,这将非常有用。


2
不保持纵横比,只是平均拉伸子元素。 - AmirHossein Rezaei

-1
你需要在窗口上设置 SizeToContent="WidthAndHeight" 以获得你想要的行为。

-4

在每个列和行宽度上,使用0.25*代替*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接