2011-11-18 105 views
10

我的谷歌和stackoverflow搜索福已經失敗了我,所以我向社區提出這個問題。StackPanel中的網格:爲什麼auto和*的行爲很奇怪?

(這是使用VS2010和.NET 4.0所有生成,在一個空白的默認WPF解決方案)

考慮以下XAML:

<StackPanel Orientation="Horizontal"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
        Background="Red" Width="200"/> 
     <Border Name="aborder2" Background="Green"/> 

    </Grid> 
</StackPanel> 

,你能預測 「aborder2」 的寬度什麼是?

如果你猜「20像素」,你會錯的。正確的答案是110像素。

考慮這個XAML:

<StackPanel Orientation="Horizontal"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 

     <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
        Background="Red" Width="200"/> 
     <Border Name="aborder2" Background="Green"/> 

    </Grid> 
</StackPanel> 

什麼,你能預測 「aborder2」 的寬度呢?

如果你猜對了20像素或110像素,你會錯的。正確答案是200像素。

我無法弄清楚,它讓我瘋狂。似乎答案應該是顯而易見的;顯然,自動填充網格列和導致網格畸形的堆疊面板之間存在一些相互作用。但它似乎並沒有使有意義 - 無論規則如何規定,這種行爲似乎都是任意的。爲什麼110像素?爲什麼不是109像素或100像素?我會理解,如果自動調整大小的列未能完全展開或者其他東西,但是讓固定寬度的列隨機忽略其寬度,則會讓我失去開發人員的外殼。

任何幫助或指導燈將不勝感激!

+0

爲什麼不aborder2得到Grid.Column? – 0x4f3759df

+0

我沒有想過要放入一個,因爲它應該默認爲第0列。我只是測試它,明確設置列似乎沒有什麼區別。 – pfw

+0

對你有一個答案,但我必須首先回家 –

回答

3

我不知道爲什麼在第一示例並不呈現正確

的第二是因爲Auto指「相同大小的內容」,但是Column2中沒有任何內容,所以Column2正在渲染0像素。 Column1中有一些跨越2個單元格的內容,但由於Column2呈現爲0 px,這意味着Column1被拉伸至200 px。默認情況下,Grid會擴展他們的子元素以填充單元格中的所有可用空間,所以這會使aborder2伸展到200px而不是20.

我認爲第一個示例可能是類似的情況,其中Column2呈現爲0px,因爲它沒有內容,但我不知道爲什麼它將aborder2設置爲110的寬度。110似乎來自(GridWidth/TotalColumns) + (1stColumnWidth/TotalColumns * NumberOfStarColumns),所以我認爲這是一個錯誤。

作爲一個側面說明,您可以設置列1的MaxWidth="20"迫使列1總是呈現爲20像素

+1

那麼,至少你得出的公式來確定110px,所以你贏得了upvote!我自己找不到任何關係。 – pfw

+0

在第一個示例中,第二列在90px處呈現,而不是0。第一列在110處呈現(110 + 90 = 200來容納'aborder1',儘管我不知道它們爲什麼以這些尺寸渲染),而'aborder2'正在伸展以填充它。 –

+0

有趣的是,設置MaxWidth可以防止調整大小。 –

1

沒有答案給你,但它似乎也發生在Silverlight中。我假設在安排和測量過程中存在一些錯誤。如果您將自定義控件放在那裏而不是邊框​​,並且覆蓋度量和排列方法,您可能會更好地瞭解發生了什麼。

要設法解決的,其中110從何而來,我猜謎(200 - 20)/ 2 + 20

編輯:我嘗試了一些其他公式,並沒有抱起來,看起來更像:

(200 + 20)/ 2