2010-09-15 148 views
10

在這個例子中,第一列獲得100,後兩列各得50,這是預期的行爲。爲什麼在中間列有MinWidth時,WPF Grid不能平均分配空間?

<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> 

alt text

如果我移動到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。

alt text

更新:我明白爲什麼會這樣,但如果有人認爲這是一個錯誤(特別是在Silverlight的行爲是不同的)

+0

尋找twitter上的答案?好吧,我想它是有效的。 – Will 2010-09-15 13:56:59

+0

嗯。我使用的是C#3.5,我的紅色列是藍色列的大小,藍色列是第二個示例中紅色列的大小。 – Crispy 2010-09-15 17:11:18

+0

@Chris是的,它改變了4.0。我無法在任何地方發現變化記錄,所以我打開了一個連接。 – Will 2010-09-15 19:17:23

回答

1

只是一個更新。我已經嘗試了不知道XAML與.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> 

任何更新在你身邊的傢伙?

0

不確定問題到底是什麼,但這兩個網格的行爲方式與您希望的一樣。我比第一個更喜歡第二個,因爲它明確指出第一個和第三個列應平均佔用剩餘空間。

<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> 
0

如果您希望等寬,則不能使用自動。您必須將每列的寬度明確設置爲所需的比例,對於每列需要「.3 *」的3列。 如果計算的寬度變得小於MinWidth,則MinWidth優先。

3

只有當您有一箇中心列時,纔會出現此問題,這意味着您有爲網格定義的奇數列。我不知道爲什麼會發生這種情況,也不認爲這是故意的行爲。但是,另一個解決方法是始終確保即使僅使用奇數列(即使用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> 

缺點是您的網格中有空列。其優點是您可以獲得預期的空間分配行爲。

+0

問題已在.NET 4.5中解決 – TMSoftDev 2013-01-15 19:26:04