【问题标题】:Why does the WPF Grid not share space equally when the middle column has a MinWidth?为什么当中间列有 MinWidth 时 WPF Grid 不能平均共享空间?
【发布时间】:2011-10-21 09:09:50
【问题描述】:

在此示例中,第一列获得 100,接下来的 2 列各获得 50,这是预期的行为。

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

如果我将 MinWidth 移到中间列...

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

...然后第一列得到 33.3,最后一列得到 66.6,这看起来很奇怪。不知道为什么这会改变网格的行为。我希望第 0 列和第 2 列各有 50 个。

更新:我明白为什么会发生这种情况,但想知道是否有人认为这是一个错误(特别是因为 Silverlight 中的行为不同)

【问题讨论】:

  • 在推特上拉皮条寻找答案?好吧,我想它奏效了。
  • 嗯。我正在使用 C#3.5,我的红色列是您的蓝色列的大小,而我的蓝色列是第二个示例的红色列的大小。
  • @Chris 是的,它随着 4.0.我找不到任何记录更改的地方,所以我打开了一个 Connect。

标签: wpf


【解决方案1】:

仅当您有一个中心列时才会出现此问题,这意味着您为网格定义了奇数列。我不确定为什么会发生这种情况,也不认为这是故意的行为。但是,另一种解决方法是始终确保定义偶数列,即使您只使用奇数列(使用 MaxWidth=0 隐藏额外列)。

    <Grid Width="200" Height="200">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MinWidth="100"/>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MaxWidth="0"/> <!--Workaround-->
        </Grid.ColumnDefinitions>

        <Border Grid.Column="0" Background="Red"/>
        <Border Grid.Column="1" Background="Yellow"/>
        <Border Grid.Column="2" Background="Blue"/>
    </Grid>

这里的缺点是您的网格中有一个空列。优点是您可以获得预期的空间分布行为。

【讨论】:

    【解决方案2】:

    只是一个更新。我已经尝试了 XAML sn-p 与 .NET 3.5/4.0 Silverlight 3/4 的组合,但仍然无法为第二个示例获得相等的宽度...

    此 XAML 是解决该问题的唯一方法:

    <Grid Width="200" Height="200">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width=".5*" />
                <ColumnDefinition MinWidth="100" />
                <ColumnDefinition Width=".5*" />
            </Grid.ColumnDefinitions>
            <Border Background="Red" Grid.Column="0" />
            <Border Background="Yellow" Grid.Column="1" />
            <Border Background="Blue" Grid.Column="2" />
        </Grid>
    

    你们那边有什么更新吗?

    【讨论】:

      【解决方案3】:

      不确定到底是什么问题,但这两个网格的行为方式符合您的要求。我更喜欢第二个而不是第一个,因为它明确指定第一列和第三列应该平均占用剩余空间。

      <Grid Width="200" Height="200">
          <Grid.ColumnDefinitions>
              <ColumnDefinition />
              <ColumnDefinition MinWidth="100" Width="Auto" />
              <ColumnDefinition />
          </Grid.ColumnDefinitions>
          <Border Background="Red" Grid.Column="0" />
          <Border Background="Yellow" Grid.Column="1" />
          <Border Background="Blue" Grid.Column="2" />
      </Grid>
      
      
      
      <Grid Width="200" Height="200">
          <Grid.ColumnDefinitions>
              <ColumnDefinition Width="1*" />
              <ColumnDefinition MinWidth="100" Width="Auto" />
              <ColumnDefinition Width="1*" />
          </Grid.ColumnDefinitions>
          <Border Background="Red" Grid.Column="0" />
          <Border Background="Yellow" Grid.Column="1" />
          <Border Background="Blue" Grid.Column="2" />
      </Grid>
      

      【讨论】:

        【解决方案4】:

        如果你想要等宽,你不能使用自动。您必须将每列的宽度显式设置为所需的比例,对于 3 列,您需要为每列设置“.3*”。 如果计算的 Width 变得小于 MinWidth,则 MinWidth 优先。

        【讨论】:

          猜你喜欢
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多