2011-11-18 3 views
10

私のgoogleとstackoverflow search-fuは私に失敗しているので、私はコミュニティにこの質問を提示します。StackPanelの中​​のグリッド:autoと*はなぜ変わったのですか?

(これは、すべての空白デフォルトWPFソリューションでは、VS2010と.NET 4.0を使用して生成される)以下のXAML考えてみましょう:あなたが "aborder2" の幅を予測する何

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

をあれ?

「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

としてレンダリングするために列1を強制的に設定することができますか? – 0x4f3759df

+0

私はそれがデフォルトで列0になるべきだから私は1つを置くとは思わなかった。私はそれをテストし、明示的に列を設定しても違いはないようだ。 – pfw

+0

答えがありますが、最初に家に帰る必要があります –

答えて

3

私は、最初の例が正しく

第二はAutoは、「コンテンツと同じサイズ」を意味しているためでレンダリングされていない理由はわかりません、しかし、あなたはColumn2に何も持っていないので、Column2は0px。 Column1には2つのセルにまたがるものがありますが、Column2は0pxでレンダリングされるため、Column1は200pxに伸びます。既定では、グリッドは子に展開して、セル内の空き領域をすべて埋めるため、aborder2は20ではなく200pxに伸びます。

最初の例は、Column2が0pxでレンダリングされる内容はありませんが、私はなぜaborder2を110の幅に設定しているのか分かりません。110は(GridWidth/TotalColumns) + (1stColumnWidth/TotalColumns * NumberOfStarColumns)から来ているようですので、バグだと思います。サイドノートとして

、あなたは列1のMaxWidth="20"常にaborder2 Grid.Columnを得ないのはなぜ20ピクセル

+1

少なくとも、110pxを決定する式を導いたので、アップヴォートに勝つことができます!私は自分自身と関係を見つけることができませんでした。 – pfw

+0

2番目の列は、最初の例では0ではなく90pxでレンダリングされます。最初の列は110(110 + 90 = 200が 'aborder1'に対応するようにレンダリングされていますが、なぜこれらのサイズでレンダリングされるのかわかりません)、' aborder2'はそれを埋めるために伸びています。 –

+0

興味深い所見では、MaxWidthを設定するとサイズ変更ができなくなります。 –

1

答えはありませんが、Silverlightでもそうです。私はアレンジと測定のパスにいくつかのバグがあると思います。ボーダーの代わりにカスタムコントロールを配置し、メジャーをオーバーライドしてメソッドを配置すると、何が起こっているのかをよりよく把握できます。私はいくつかの他の式を試してみましたが、それがホールドアップしませんでした、ルックス:/ 2 + 20

EDIT - 110は、I(20 200)を推測しているどこから来たの謎を解決しようとする

以上のように:

(200 + 20)/ 2

関連する問題