使用WPF的网格布局调整大小问题

时间:2011-01-19 03:22:27

标签: wpf

这是我的问题。我连续有三个控件(它们捕获人的名字)。控件本身的大小适合于适当的大小。我想将这三个控件水平放置,以沿着线均匀分布。这一点很简单:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition />
  </Grid.RowDefinitions>
  <Border Grid.Row="0" Grid.Column="0" BorderThickness="2" Height="50" Width="50" />
  <Border Grid.Row="0" Grid.Column="1" BorderThickness="2" Height="50" Width="50" />
  <Border Grid.Row="0" Grid.Column="2" BorderThickness="2" Height="50" Width="50" />
</Grid>

当我想要隐藏第二个条目时,问题出现了。如果我将其可见性设置为折叠,我希望剩余的两个项目间隔相等。这不会发生,中间列保持在网格宽度的1/3处。

我尝试了网格和堆叠面板的各种组合,但无法找到解决方法。我试图找到一个相当通用的解决方案,因为这种情况可能再次出现。

从视觉上看,它应该如下:

   +----------------------------------------------+
   | +------------+ +------------+ +------------+ |
   | |aardvark    | |beatle      | |cat         | |
   | +------------+ +------------+ +------------+ |
   +----------------------------------------------+

请注意,内框使用width = *将它们调整为1/3,但框内的控件不会拉伸。

3 个答案:

答案 0 :(得分:0)

如果你改变所有3:

,你仍会遇到同样的问题

<ColumnDefinition Width="Auto" />

供参考: http://msdn.microsoft.com/en-us/library/system.windows.controls.columndefinition.width%28VS.96%29.aspx

答案 1 :(得分:0)

不是设置“可见性”,而是将ColumnDefinition的宽度设置为0

假设网格的名称是grid1,那么

grid1.ColumnDefinitions[1].Width = new GridLength(0);

答案 2 :(得分:0)

这就是我最终解决问题的方法。

  <Grid>   
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" />
      <ColumnDefinition Width="{Binding IsVisible, Converter={StaticResource collapsed2auto}}"/>
      <ColumnDefinition Width="*" />  
   </Grid.ColumnDefinitions>   
   <Grid.RowDefinitions>    
     <RowDefinition />   
   </Grid.RowDefinitions>   
   <Border Grid.Row="0" Grid.Column="0" BorderThickness="2" Height="50" Width="50" />   
   <Border Grid.Row="0" Grid.Column="1" BorderThickness="2" Height="50" Width="50" Visibility="{Binding Path=IsVisible}"/>   
   <Border Grid.Row="0" Grid.Column="2" BorderThickness="2" Height="50" Width="50" /> 
  </Grid> 

这感觉就像最不讨厌的解决方案。基本上,它使用相同的属性来禁用控件,通过转换器将其转换为“*”或“auto”并将其分配给列定义。似乎工作。

我还考虑建立一个触发器来做同样的事情,但这感觉更清洁。