2013-05-31 19 views
6

Gridsplitters ile denemeye yeni başladım ve çok garip bir davranışa rastladım ve bunu düzeltmek mümkün görünmüyor. Görünüşe göre başkalarının da benzer sorunları var (google'a göre), ancak yararlı yorumlar yoktu.Gridsplitter: Satır yüksekliğini pencere boyutuna sınırla

2 satıra sahip bir ızgaram var. En baştaki satır ile Hight vardır. Satırları ayırıcıyla yeniden boyutlandırdığımda, davranış en üst sırada beklendiği gibi olur. Fakat splitter'i yukarı ve program penceresini geçtiğimde, alt sıranın içeriği pencereden çıkar (= gitene kadar aşağı doğru hareket eder). Her satırın ana kapsayıcıdan daha büyük olamamasını beklerdim.

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

Bu benim kodum. Her iki satırın içeriği yine ızgaralarda barındırılıyor ve sadelik uğruna ortadan kaldırıldı. Tekrar: Üst satır için yeniden boyutlandırma iyi çalışıyor. Ancak alt satır sonsuzluğa yeniden boyutlandırılabilir. MaxHeight'u sabit kodladığım takdirde beklendiği gibi çalışır. Ama bu pencere büyüklüğüne bağlı olmalı.

cevap

4

deneyin şeklinde değiştirerek aşağıdaki ikinci RowDefinition:

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

Bu satır yüksekliği pencere boyutunu aşmaması sağlayacaktır.

+0

Teşekkür: Ben de üst veya alt satırlarda MinHeight ayarlarsanız ben hâlâ sorun görüyordum rağmen Böylece aşağıdaki alt sıra tanımı, benim için çalıştı. Bu işe yarıyor. Ama en üst sıradaki “MinHeight” ın uygulanmasının zor olduğu kanıtlanıyor ... WPF ile uğraşırken, normalde sh * t'yi bunun dışında lanetliyorum ve bir noktada düşünmemi sağlayan gerçekten zarif bir çözüm var. WPF, her şeyden sonra gerçekten harika ". Bu konuda bu noktaya ulaşacağımdan emin değilim ... – Jan

+0

Ne demek istediğini biliyorum, aynı şekilde çok fazla zaman hissediyorum. Üst sıra için bir MinHeight tanımlamak için bir çözüm var, zarif mi yoksa tartışmasız mı? Bir MultiValueConverter kullanırsanız, Grid'in ActualHeight'ı önceki gibi ve en üstteki MinHeight geçirebilir ve farkı döndürürsünüz. Bu değeri ikinci satırdaki maksimum yüksekliğiniz olarak kullanın. –

+0

Ofset uygulamak için bir 'IValueConverter' kullandım. – Peter

0

Richard'ın çözümü benim için işe yaramadı (ızgaranın ActualHeight öğesi, pencere yüksekliği boyunca satır yüksekliği ile birlikte genişletildi).

Snoop'u kullanarak, bir ContentPresenter nesnesinin ActualHeight öğesinin artmadığını buldum. cevap için

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