2013-05-31 5 views
6

Я только что начал экспериментировать с сетками и наткнулся на очень странное поведение, и я не могу его исправить. По-видимому, у других есть аналогичные проблемы (согласно google), но не было никаких полезных комментариев.Gridsplitter: ограничение высоты строки до размера окна

У меня есть сетка с 2 рядами. При запуске нижняя имеет Hight из 250. Верхний ряд занимает остальное с *. Когда я изменяю размер строк с помощью сплиттера, поведение выглядит так, как ожидалось для верхней строки. Но когда я перетаскиваю сплиттер вверх и мимо окна программы, содержимое нижней строки выпадет из окна (= перемещение вниз, пока оно не исчезнет). Я бы ожидал, что я не могу сделать каждую строку более крупной, чем родительский.

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

Это мой код. Содержимое обеих строк снова размещается в сетках и удалено для простоты. Опять же: изменение размера верхней строки отлично работает. Но нижняя строка может быть изменена до бесконечности. Он работает как ожидалось, если я с жестким кодом MaxHeight. Но это зависит от размера окна.

ответ

4

Попробуйте изменить второй RowDefinition к следующему:

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

Это гарантирует, что высота строки не будет превышать размер окна.

+0

Спасибо за ответ. Это работает. Но реализация «MinHeight» для верхней строки оказывается ... сложной ... Когда вы работаете с WPF, я обычно проклинаю sh * t, и в какой-то момент у меня есть действительно элегантное решение, которое заставляет меня думать: «Wow , WPF действительно классный ». Не уверен, что я достиг этого момента на эту тему, хотя ... – Jan

+0

Я знаю, что вы имеете в виду, я чувствую то же самое много времени. Существует решение для определения MinHeight для верхней строки, будь то элегантный или нет, является спорным! Если вы используете MultiValueConverter, вы можете передать ему ActualHeight из сетки, как и раньше, и верхний ряд MinHeight и вернуть разницу. Используйте это значение как максимальную высоту во второй строке. –

+0

Я использовал «IValueConverter» для применения смещения. – Peter

0

Решение Ричарда не сработало для меня (ActualHeight сетки развернулся за размером окна вместе с высотой строки).

Используя Snoop, я обнаружил, что ActualHeight предка ContentPresenter не увеличивался. Таким образом, для меня работало следующее определение нижнего ряда, хотя я все еще видел проблемы, если я установил MinHeight в верхнем или нижнем строках:

<RowDefinition Height="430" 
       MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/> 
Смежные вопросы