2012-06-21 10 views
5

To pytanie jest trudne do opisania w sposób zwięzły, więc nie bierz mnie.Rozmiar siatek WPF

Obecnie mam siatkę z dwoma rzędami. Wysokość pierwszego wiersza to Auto, a wysokość drugiego wiersza to *, więc gdy zmieniam rozmiar okna, drugi wiersz rośnie i kurczy się zgodnie z oknem.

Jest to podstawowy układ:

<Window> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Border> 
      ... 
     </Border> 
     <Border Grid.Row="2"> 
      ... 
     </Border> 
    </Grid> 
</Window> 

Oto biedny szkic istniejącego zachowania:

____ ____ ____ 
    ->  -> 
____ ____ ____ 
       ____ 
     ____ 
____ 

chciałbym dodać coś w rodzaju „minimalnej wysokości” z drugiego rzędu , więc gdy zmieniam rozmiar okna na tyle mały, drugi rząd przestaje się kurczyć, a pierwszy wiersz zaczyna się zmniejszać.

pożądanego zachowania:

____ ____ ____ 
    ->  -> ____ 
____ ____ 
       ____ 
     ____ 
____ 

Czy istnieje prosty sposób, aby uzyskać minimalną wysokość dla drugiego rzędu, a pierwszy z nich zmusić się kurczyć?

Więcej szczegółów:

Kiedy ustawić MinHeight w drugim rzędzie, po prostu klipów siatki po zmianie rozmiaru go poniżej tej wielkości.

Wielkość elementów sterujących w pierwszym wierszu jest nieznana podczas kompilacji, ale jest znana w czasie wykonywania. Jeśli jest to niezbędna część rozwiązania, mogę ustawić MaxHeight wiersza, ale teraz działa automatyczna wysokość.

Kontrolki w drugim rzędzie nie mają wyraźnego rozmiaru. Mogą one być zmieniane, ale staram się, aby nie stały się mniejsze niż pożądana minimalna wysokość.

Odpowiedz

7

Wielkość elementów sterujących w pierwszym wierszu jest nieznana podczas kompilacji, ale jest znana w czasie wykonywania. Jeśli jest to niezbędna część rozwiązania, mogę ustawić MaxHeight wiersza, ale teraz działa automatyczna wysokość.

Myślę, że to prawdopodobnie będzie najprostsze rozwiązanie. Wiążą maxheight do wartości obliczonej w czasie wykonywania:

<Grid.RowDefinitions> 
    <RowDefinition Height="*" MaxHeight="{Binding MyProperty}"/> 
    <RowDefinition Height="*" MinHeight="100"/> 
</Grid.RowDefinitions> 

Edit: W poprzednim rozwiązaniem jest blisko, ale nie są poprawne. Oto sposób, aby osiągnąć pożądany rezultat, jednak nie wiem, czy to jest optymalny podejście:

<Grid ShowGridLines="True" Name="myGrid"> 
    <Grid.Resources> 
     <local:RowHeightConverter x:Key="rowHeightConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Name="row1" MaxHeight="{Binding MyProperty}"> 
      <RowDefinition.Height> 
       <MultiBinding Converter="{StaticResource rowHeightConverter}"> 
        <Binding Path="ActualHeight" ElementName="row2" /> 
        <Binding Path="ActualHeight" ElementName="myGrid" /> 
        <Binding Path="MaxHeight" ElementName="row1" /> 
       </MultiBinding> 
      </RowDefinition.Height> 
     </RowDefinition> 
     <RowDefinition Name="row2" Height="*" MinHeight="300"/> 
    </Grid.RowDefinitions> 
</Grid> 

A twój konwerter:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    double row2Height = (double)values[0]; 
    double gridHeight = (double)values[1]; 
    double row1MaxHeight = (double)values[2]; 

    if (gridHeight - row2Height >= row1MaxHeight) 
    { 
     return gridHeight - row2Height; 
    } 

    return row1MaxHeight; 
} 
+0

nie działa. Wysokość pierwszego rzędu zachowuje się dokładnie tak, jak gdyby w drugim rzędzie nie było MinHeight. Zmienia rozmiar o połowę szybciej niż okno. Powoduje to obcięcie drugiego wiersza. –

+0

@KendallFrey Poprzednie rozwiązanie nie działało we wszystkich przypadkach, więc dodałem rozwiązanie, które powinno spełnić Twoje potrzeby. –

+0

Dzięki za MultiBinding. Nie wiedziałem o tym. Jedno pytanie: Rzeczywista siatka ma kilka innych wierszy o stałym i automatycznym rozmiarze, więc zakładam, że powinienem zrobić 'gridHeight - row2height - row3height', etc.? –