2011-01-19 60 views
1

這是我的問題。我連續有三個控件(它們捕捉人們的姓名)。這些控件本身將其尺寸調整爲適當的尺寸。我想要將這三個控件水平放置以沿着線均勻間隔。這一點很簡單: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   | | 
    | +------------+ +------------+ +------------+ | 
    +----------------------------------------------+ 

注意,內盒使用寬度= *尺寸他們至1/3,但盒子內的控制沒有被拉伸。

+0

你設置爲摺疊狀態?此xaml中顯示的邊框元素的硬編碼寬度爲50或邊界的子元素? – 2011-01-19 04:17:58

+0

出於測試目的,我只是使用上面的示例摺疊邊框。如果我能得到一個簡單的案例,那麼我會嘗試讓我的應用以同樣的方式工作。 – dave 2011-01-19 04:24:59

回答

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」並將其分配給列定義。似乎工作。

我也曾經考慮過建立一個觸發器來做同樣的事情,但是這樣感覺更乾淨。

0

而不是設置能見度,設置ColumnDefinition到的寬度0

假設網格的名稱是grid1然後

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