2013-05-31 8 views
6

Właśnie zacząłem eksperymentować z siatkami i natknąłem się na bardzo dziwne zachowanie i nie mogę tego naprawić. Najwyraźniej inni mają podobne problemy (według Google), ale nie było żadnych pomocnych komentarzy.Rozpraszacz siatki: ogranicz wysokość linii do rozmiaru okna

Mam siatkę z 2 rzędami. Po uruchomieniu dolny ma Hight z 250. Górny rząd zajmuje resztę z *. Gdy zmieniam rozmiar wierszy za pomocą splittera, zachowanie jest zgodne z oczekiwaniami dla górnego wiersza. Ale kiedy przeciągnę łuk w górę i minę okno programu, zawartość dolnego rzędu wypadnie z okna (= przesuń w dół, aż zniknie). Spodziewałbym się, że nie mogę uczynić każdego wiersza większego niż kontener nadrzędny.

<Grid x:Name="grid_main" ScrollViewer.VerticalScrollBarVisibility="Disabled" > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition MinHeight="250" Height="250"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <GridSplitter x:Name="splitter" 
     ResizeDirection="Rows" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Width="Auto" 
     Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0" ResizeBehavior="BasedOnAlignment" /> 
    <Grid Grid.Column="0" Grid.Row="0"> 
    </Grid> 
    <Grid Grid.Column="0" Grid.Row="1">    
    </Grid> 
</Grid> 

To jest mój kod. Zawartość obu wierszy jest ponownie hostowana w siatkach i została usunięta ze względu na prostotę. Ponownie: zmiana rozmiaru w górnym wierszu działa dobrze. Ale dolny rząd można zmienić na nieskończoność. Działa zgodnie z oczekiwaniami, jeśli twardo kod MaxHeight. Ale to musi zależeć od rozmiaru okna.

Odpowiedz

4

Spróbuj zmienić sekund RowDefinition na następujące kwestie:

<RowDefinition MinHeight="250" MaxHeight="{Binding ElementName=grid_main, Path=ActualHeight}" Height="250"/> 

Zapewni to, że wysokość rząd nie przekroczy rozmiar okna.

+0

Dzięki za odpowiedź. To działa. Ale implementacja 'MinHeight' dla górnego rzędu okazuje się być ... trudna ... Kiedy mam do czynienia z WPF normalnie przeklinam sh * t z niego i w pewnym momencie mam naprawdę eleganckie rozwiązanie, które sprawia, że ​​myślę" Wow , WPF jest naprawdę fajny ". Nie jestem pewien, czy osiągnę ten punkt na ten temat, chociaż ... – Jan

+0

Wiem, co masz na myśli, tak samo czuję się przez większość czasu. Istnieje rozwiązanie definiujące MinHeight dla górnego rzędu, niezależnie od tego, czy jest eleganckie czy nie, jest dyskusyjne! Jeśli używasz MultiValueConverter, możesz przekazać mu ActualHeight of Grid, jak poprzednio, oraz górny rząd MinHeight i zwrócić różnicę. Użyj tej wartości jako maksymalnej wysokości w drugim rzędzie. –

+0

Użyłem 'IValueConverter' do zastosowania przesunięcia. – Peter

0

Rozwiązanie Richarda nie działa dla mnie (ActualHeight siatki rozszerzyła się poza rozmiar okna wraz z wysokością wiersza).

Korzystając z Snoop, stwierdziłem, że ActualHeight przodka ContentPresenter nie wzrastał. Tak więc dla mnie działała poniższa definicja dolnego rzędu, chociaż nadal widziałem problemy, gdy ustawiłem MinHeight na górnym lub dolnym wierszu:

<RowDefinition Height="430" 
       MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/> 
Powiązane problemy