2011-11-18 15 views
10

Moje google i stackoverflow search-fu mnie zawiodły, więc przedstawiam społeczności to pytanie.Siatka wewnątrz StackPanel: dlaczego auto i * zachowują się dziwnie?

(To wszystko jest generowane przy użyciu VS2010 i .NET 4.0, w pustym domyślnie WPF roztwór)

Rozważmy następujący 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> 

Co byś przewidzieć szerokość "aborder2" do być?

Jeśli zgadłeś "20 pikseli", byłbyś w błędzie. Prawidłowa odpowiedź to 110 pikseli.

Rozważmy 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> 

Co byś przewidzieć szerokość "aborder2" być?

Jeśli zgadłeś 20 pikseli lub 110 pikseli, byłbyś w błędzie. Prawidłowa odpowiedź to 200 pikseli.

Nie mogę tego zrozumieć i to doprowadza mnie do szaleństwa. Wygląda na to, że odpowiedź powinna być oczywista; widać, że istnieje pewna interakcja między kolumną siatki z automatycznym napełnianiem a panelem kominowym, który powoduje zasadzkę w sieci. Ale po prostu nie wydaje się, aby sensie - niezależnie od tego, jakie zasady rządzą tym zachowaniem, wydają się być arbitralne. Dlaczego 110 pikseli? Dlaczego nie 109 pikseli lub 100 pikseli? Rozumiem, że kolumna o automatycznym rozmiarze nie mogła się w pełni rozwinąć lub coś takiego, ale aby kolumna o stałej szerokości losowo zignorowała jej szerokość, pozostawiłam wypaloną powłokę programisty.

Każda pomoc lub światło prowadzące będą mile widziane!

+0

Dlaczego nie aborder2 uzyskać Grid.Column? – 0x4f3759df

+0

Nie pomyślałem, aby umieścić jeden, ponieważ powinien domyślnie do kolumny 0. Właśnie przetestowałem to i jawnie ustawienie kolumny nie wydaje się robić różnicy. – pfw

+0

Masz dla ciebie odpowiedź, ale najpierw muszę iść do domu –

Odpowiedz

3

nie mam pojęcia, dlaczego to pierwszy przykład nie jest prawidłowo

The 2nd dlatego Auto oznacza "ten sam rozmiar jak zawartość" rendering, ale nie masz nic w kolumnie 2, więc kolumna 2 jest renderowana 0px. Masz coś w kolumnie 1, która obejmuje 2 komórki, ale ponieważ kolumna 2 jest renderowana na 0 pikseli, oznacza to, że kolumna 1 jest rozciągnięta do 200 pikseli. Domyślnie, Grid rozwija dzieci, aby wypełnić całą dostępną komórkę w komórce, co powoduje, że aborder2 rozciąga się do 200px zamiast 20.

Myślę, że pierwszym przykładem może być podobna sytuacja, w której kolumna 2 renderuje się w 0px, ponieważ nie ma żadnej zawartości, ale nie jestem pewien, dlaczego ustawia aborder2 na szerokość 110. 110 wydaje się pochodzić z (GridWidth/TotalColumns) + (1stColumnWidth/TotalColumns * NumberOfStarColumns), więc myślę, że to błąd.

Na marginesie można ustawić Kolumna1 na MaxWidth="20" zmusić COLUMN1 zawsze czynią jako 20 pikseli

+1

Cóż, przynajmniej wyprowadziłeś formułę, aby określić 110px, aby wygrać przegraną! Sam nie mogłem znaleźć żadnego związku. – pfw

+0

Druga kolumna renderuje 90px, a nie 0 w pierwszym przykładzie. Pierwsza kolumna wyświetla się w 110 (110 + 90 = 200, aby uwzględnić "aborder1", choć nie wiem, dlaczego są renderowane w tych rozmiarach), a 'aborder2' rozciąga się, aby ją wypełnić. –

+0

Interesująca obserwacja, że ​​ustawienie MaxWidth zapobiega zmianie rozmiaru. –

1

Brak odpowiedzi dla ciebie, ale wydaje się, że dzieje się to również w Silverlight. Założę się, że jest jakiś błąd w przepływie ustawień i pomiarów. Jeśli umieścisz tam niestandardową kontrolę zamiast obramowania i zastąpisz miary i uporządkujesz metody, prawdopodobnie uzyskasz lepszy obraz tego, co się dzieje.

Aby spróbować rozwiązać tajemnicę gdzie 110 pochodzi, zgaduję (200 - 20)/2 + 20

EDIT: Próbowałem kilka innych formuł i nie trzymaj się, wygląd więcej takich jak:

(200 + 20)/2

Powiązane problemy