SizeToContent 不遵守 SharedSizeGroups

SizeToContent not respecting SharedSizeGroups

使用 window 的 SizeToContent="WidthAndHeight" 属性 似乎破坏了网格的列和行定义的 属性 SharedSizeGroup.

<Window x:Class="SizeTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow"
        SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" SharedSizeGroup="MainColumnWidth" />
            <ColumnDefinition Width="*" SharedSizeGroup="MainColumnWidth" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="*" SharedSizeGroup="MainRowHeight" />
            <RowDefinition Height="*" SharedSizeGroup="MainRowHeight" />
        </Grid.RowDefinitions>

        <Border BorderThickness="1" BorderBrush="Black" Grid.Column="0" Grid.Row="0" >
            <Button Width="100" Height="100" Margin="10" Content="A" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black" Grid.Column="1" Grid.Row="0" >
            <Button Width="100" Height="200" Margin="10" Content="B" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black" Grid.Column="0" Grid.Row="1" >
            <Button Width="200" Height="100" Margin="10" Content="C" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black" Grid.Column="1" Grid.Row="1" >
            <Button Width="100" Height="100" Margin="10" Content="D" />
        </Border>
    </Grid>
</Window>

例如,上面的代码生成以下内容:

但是,我希望它产生类似于

它根据组件调整大小但尊重共享组大小。

调整大小会立即应用共享的组大小,但随后您必须手动猜测正确的大小。

有什么办法可以解决这个问题吗?

如果有任何不同,我正在使用 .NET 5。


编辑

Grid.IsSharedSizeScope="True" 添加到 window 或网格最初似乎可以解决问题,但在调整 window 大小时,网格不再填充 window。

我怀疑正在发生的事情是没有 IsSharedSizeScope,由于列/行定义说宽度/高​​度是 *,所以列/行的大小只是相同的,但是当 IsSharedSizeScope 为真,则共享大小范围生效,但由于某种原因,在有 space 增长时停止调整网格大小。

看来您需要使用 UniformGrid

    <UniformGrid Rows="2" Columns="2">
        <Border BorderThickness="1" BorderBrush="Black">
            <Button Width="100" Height="100" Margin="10" Content="A" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black">
            <Button Width="100" Height="200" Margin="10" Content="B" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black">
            <Button Width="200" Height="100" Margin="10" Content="C" />
        </Border>

        <Border BorderThickness="1" BorderBrush="Black">
            <Button Width="100" Height="100" Margin="10" Content="D" />
        </Border>
    </UniformGrid>

Using a window's SizeToContent="WidthAndHeight" property seems to break a grid's column and row definition's property SharedSizeGroup.

否,为了利用共享尺码组,您必须设置要应用的共享尺码组的范围。这就是你对 IsSharedSizeScope 属性 附加的 属性 所做的,默认情况下是 false,这意味着最初 没有定义范围 在任何元素上,因此共享尺寸组将不适用。

<Grid IsSharedSizeScope="True">
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" SharedSizeGroup="MainColumnWidth" />
      <ColumnDefinition Width="*" SharedSizeGroup="MainColumnWidth" />
   </Grid.ColumnDefinitions>

   <Grid.RowDefinitions>
      <RowDefinition Height="*" SharedSizeGroup="MainRowHeight" />
      <RowDefinition Height="*" SharedSizeGroup="MainRowHeight" />
   </Grid.RowDefinitions>
   <!-- ...other grid definitions. -->
</Grid>

For example, the code above produces the following: [...] Resizing instantly applies the shared group sizes but then you have to manually guess where the correct size is.

这与共享尺码组无关,但与 Grid 本身有关。您可以删除所有共享大小定义,它会产生相同的结果。事实上,共享大小定义是多余的,因为给每个列和单元格一个 * 大小,将按相同比例缩放它们。见 documentation for reference.

Star sizing is used to distribute available space by weighted proportions.

不幸的是,我不知道为什么初始大小完全适合 Grid 内容而不是尊重星星大小。但是,应用 MinWidthMinHeight 可以解决问题(如果适用)。

<Grid IsSharedSizeScope="True">
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" MinWidth="200" />
      <ColumnDefinition Width="*" MinWidth="200" />
   </Grid.ColumnDefinitions>
   <Grid.RowDefinitions>
      <RowDefinition Height="*" MinHeight="200" />
      <RowDefinition Height="*" MinHeight="200" />
   </Grid.RowDefinitions>
   <!-- ...other grid definitions. -->
</Grid>

这可能与 related question 中的星号调整问题相同或类似。

[...] when IsSharedSizeScope is true, then the shared size scope come into effect, but for some reason stop the grid resizing when there is space for it to grow.

这是预期的,因为 setting a shared size group will treat sizes differently

Columns and rows that participate in size-sharing do not respect Star sizing. In the size-sharing scenario, Star sizing is treated as Auto.

因此,如果您应用 *Grid 将被测量并且即使在调整大小后大小仍将保持不变。

如您所问,您正在处理网格中的统一单元格。在这种情况下,您可以通过简单地使用专用于这种情况的 UniformGrid 控件来规避这些问题。

Provides a way to arrange content in a grid where all the cells in the grid have the same size.

<UniformGrid>
   <Border BorderBrush="Black" BorderThickness="1">
      <Button Width="100" Height="100" Margin="10" Content="A" />
   </Border>
   <Border BorderBrush="Black" BorderThickness="1">
      <Button Width="100" Height="200" Margin="10" Content="B" />
   </Border>
   <Border BorderBrush="Black" BorderThickness="1">
      <Button Width="200" Height="100" Margin="10" Content="C" />
   </Border>
   <Border BorderBrush="Black" BorderThickness="1">
      <Button Width="100" Height="100" Margin="10" Content="D" />
   </Border>
</UniformGrid>