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
内容而不是尊重星星大小。但是,应用 MinWidth
和 MinHeight
可以解决问题(如果适用)。
<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>
使用 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 propertySharedSizeGroup
.
否,为了利用共享尺码组,您必须设置要应用的共享尺码组的范围。这就是你对 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
内容而不是尊重星星大小。但是,应用 MinWidth
和 MinHeight
可以解决问题(如果适用)。
<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>