这是我的问题。我连续有三个控件(它们捕获人的名字)。控件本身的大小适合于适当的大小。我想将这三个控件水平放置,以沿着线均匀分布。这一点很简单:
<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,但框内的控件不会拉伸。
答案 0 :(得分:0)
如果你改变所有3:
,你仍会遇到同样的问题 <ColumnDefinition Width="Auto" />
答案 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”并将其分配给列定义。似乎工作。
我还考虑建立一个触发器来做同样的事情,但这感觉更清洁。