【问题标题】:WPF grid layout bugWPF 网格布局错误
【发布时间】:2013-01-06 05:23:25
【问题描述】:

在下面的 WPF 网格中,中间列不是 6。文本 B 一直在右边,而不是距离文本 A 6。我已经尝试 * 而不是 Auto 其他列,但结果是一样的.

如何使中间列 6?有解决方法吗?为什么会这样?这是预期的行为还是错误?

我以这种方式制作网格,这样我就不必为每个元素设置边距。

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="6" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="6" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBlock Grid.ColumnSpan="3" Grid.Column="0" HorizontalAlignment="Left">xxxxxxxxxxxxxxxxxxxxxxxxxxxx</TextBlock>
        <TextBlock Grid.Row="2">Text A</TextBlock>
        <Rectangle Fill="YellowGreen" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" />
        <TextBlock Grid.Row="2" Grid.Column="2"  Background="LightCoral">Text B</TextBlock>
    </Grid>
</ScrollViewer>

注意:我的窗口宽度是自动的。

编辑: 使用@flq's solution 但添加了水平滚动的scrollviewer,问题又回来了。这可能与解决方案无法在设计器中正确显示的原因相同,与 WPF 不知道如何在没有约束宽度的情况下计算宽度有关。

【问题讨论】:

  • 尝试在引号内的 6 周围加上星号,而不是仅仅 "6" 我认为这应该可以解决它
  • 我把它拿回来了,刚刚试了一下,它把第二列右对齐到跨越的文本,扩大了中间列...
  • @flq 澄清 - 文本 B 一直在右侧,而不是距离文本 A 6。

标签: wpf layout grid


【解决方案1】:

我认为您想在其他非固定长度的列上使用“*”

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="6" />
    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

【讨论】:

    【解决方案2】:

    我无法确认将第三列设置为 * 不起作用。使用以下 XAML:

    <Grid HorizontalAlignment="Left">
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="6" />
          <ColumnDefinition Width="*" />
    
      </Grid.ColumnDefinitions>
    
      <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
          <RowDefinition Height="6" />
          <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>
    
      <TextBlock Grid.ColumnSpan="3" Grid.Column="0" HorizontalAlignment="Left">xxxxxxxxxxxxxxxxxxxxxxxxxxxx</TextBlock>
      <TextBlock Grid.Row="2">Text A</TextBlock>
      <Rectangle Fill="YellowGreen" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" />
      <TextBlock Grid.Row="2" Grid.Column="2"  Background="LightCoral">Text B</TextBlock>
    </Grid>
    

    我明白了:

    【讨论】:

      【解决方案3】:

      如何使中间列 6?有解决办法吗?

      通过在ScrollViewer 内设置MaxWidth 解决(我使用了最大的双精度值)。

      为什么会这样?这是预期的行为还是错误?

      在 ScrollViewer(或设计器)中,没有最大宽度。在布局计算中的某处,它将列宽分配为 6 + *。

      我认为最终这是一个错误,因为可以计算列宽而不需要最大宽度(它被指定为固定值,甚至不需要计算)。

      <ScrollViewer HorizontalScrollBarVisibility="Auto">
          <Grid MaxWidth="1.79769E308">
              <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="Auto" />
                  <ColumnDefinition Width="6" />
                  <ColumnDefinition Width="Auto" />
                  <ColumnDefinition Width="*" />
              </Grid.ColumnDefinitions>
      
              <Grid.RowDefinitions>
                  <RowDefinition Height="Auto" />
                  <RowDefinition Height="6" />
                  <RowDefinition Height="Auto" />
              </Grid.RowDefinitions>
      
              <TextBlock Grid.ColumnSpan="4">xxxxxxxxxxxxxxxxxxxxxxxxxxxx</TextBlock>
              <TextBlock Grid.Row="2">Text A</TextBlock>
              <Rectangle Fill="YellowGreen" Grid.Column="1" Grid.Row="2" />
              <TextBlock Grid.Row="2" Grid.Column="2" Background="LightCoral">Text B</TextBlock>
          </Grid>
      </ScrollViewer>
      

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 2014-04-09
        • 2010-12-06
        • 2017-11-26
        • 1970-01-01
        • 2012-06-25
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多