首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SizeToContent不尊重SharedSizeGroups

SizeToContent不尊重SharedSizeGroups
EN

Stack Overflow用户
提问于 2021-01-09 13:59:14
回答 2查看 65关注 0票数 2

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

代码语言:javascript
复制
<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"添加到窗口或网格似乎解决了这个问题,但是当调整窗口大小时,网格将不再填充该窗口。

我怀疑,如果没有IsSharedSizeScope,由于列/行定义中的宽度/高度为*,但是当IsSharedSizeScope为真时,则共享大小范围生效,因此列/行只是相同的大小,但由于某种原因,当网格有增长空间时,停止调整网格大小。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-09 16:46:45

看来你需要使用UniformGrid

代码语言:javascript
复制
    <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>
票数 2
EN

Stack Overflow用户

发布于 2021-01-11 11:55:52

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

不,为了利用共享大小组,您必须为共享大小组设置一个应用范围。这就是您对附加的IsSharedSizeScope属性所做的操作,默认情况下它是false,这意味着最初在任何元素上都没有定义范围的,因此共享大小组将不应用。

代码语言:javascript
复制
<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>

例如,上面的代码生成以下内容:调整大小会立即应用共享组大小,但随后您必须手动猜测正确的大小。

这与共享大小组无关,而是与Grid本身相关。您可以删除所有共享大小定义,它将产生相同的结果。实际上,共享大小定义是多余的,因为为每个列和单元提供一个*大小,它们将按相同比例缩放。见供参考的文件

星号大小用于按加权比例分配可用空间。

不幸的是,我不知道为什么信息大小完全适合Grid内容,而不是尊重明星大小。但是,如果适用的话,应用MinWidthMinHeight可以解决这个问题。

代码语言:javascript
复制
<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>

这可能是同样的问题,也可能是一个类似的问题,明星大小,如在这个相关问题

..。当IsSharedSizeScope为真时,共享大小范围就会生效,但是由于某种原因,当网格有增长的空间时,就停止调整网格大小。

这是预期的,因为设置共享大小组将以不同的方式对待大小。

参加大小共享的列和行不尊重星号大小。在大小共享场景中,Auto.将星号调整为星号。

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

正如您的问题所暗示的,您正在处理网格中的统一单元格。在这种情况下,您可以通过使用专门用于此场景的UniformGrid控件来解决这些问题。

提供一种在网格中排列内容的方法,网格中的所有单元格都具有相同的大小。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65643487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档