2013-05-31 31 views
6

Tôi vừa mới bắt đầu thử nghiệm với các trình tạo ảnh và đã tình cờ gặp một hành vi rất lạ và tôi dường như không thể sửa nó. Rõ ràng những người khác có vấn đề tương tự (theo google), nhưng không có ý kiến ​​hữu ích.Gridsplitter: giới hạn chiều cao hàng với kích thước cửa sổ

Tôi có lưới có 2 hàng. Khi khởi động phần dưới cùng có một số Hight trong số 250. Hàng trên cùng có phần còn lại với *. Khi tôi thay đổi kích thước các hàng bằng bộ chia, hành vi được mong đợi cho hàng trên cùng. Nhưng khi tôi kéo splitter lên trên và qua cửa sổ chương trình, nội dung của hàng dưới cùng sẽ thả ra khỏi cửa sổ (= di chuyển xuống dưới cho đến khi nó biến mất). Tôi hy vọng rằng tôi không thể làm cho mỗi hàng lớn hơn container mẹ.

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

Đây là mã của tôi. Nội dung của cả hai hàng lại được lưu trữ trong lưới và đã bị xóa vì mục đích đơn giản. Một lần nữa: Thay đổi kích thước cho hàng đầu hoạt động tốt. Nhưng hàng dưới cùng có thể được thay đổi kích thước thành vô cùng. Nó hoạt động như mong đợi nếu tôi mã cứng một số MaxHeight. Nhưng điều đó phải phụ thuộc vào kích thước cửa sổ.

Trả lời

4

Hãy thử thay đổi của bạn thứ hai RowDefinition như sau:

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

này sẽ đảm bảo rằng chiều cao hàng sẽ không vượt quá kích thước cửa sổ.

+0

Cảm ơn bạn đã trả lời. Điều đó hoạt động. Nhưng thực hiện một 'MinHeight' cho hàng đầu chứng minh là ... khó khăn ... Khi giao dịch với WPF tôi thường nguyền rủa sh * t ra khỏi nó và tại một số điểm tôi có một giải pháp thực sự thanh lịch mà làm cho tôi nghĩ rằng" Wow , WPF là thực sự mát mẻ sau khi tất cả ". Không chắc chắn tôi sẽ đạt đến điểm này về chủ đề này mặc dù ... – Jan

+0

Tôi biết những gì bạn có nghĩa là, tôi cảm thấy cùng một cách rất nhiều thời gian. Có một giải pháp để xác định một MinHeight cho hàng đầu, cho dù đó là thanh lịch hay không là gây tranh cãi! Nếu bạn sử dụng một MultiValueConverter bạn có thể vượt qua nó ActualHeight của lưới như trước, và hàng đầu MinHeight và trả lại sự khác biệt. Sử dụng giá trị này làm chiều cao tối đa của bạn trên hàng thứ hai. –

+0

Tôi đã sử dụng 'IValueConverter' để áp dụng bù đắp. – Peter

0

Giải pháp của Richard không hoạt động đối với tôi (ActualHeight của lưới được mở rộng qua kích thước cửa sổ cùng với chiều cao hàng).

Sử dụng Snoop, tôi thấy rằng ActualHeight của tổ chức ContentPresenter không tăng lên. Do đó định nghĩa hàng dưới cùng đã hoạt động đối với tôi, mặc dù tôi vẫn gặp sự cố nếu tôi đặt MinHeight ở các hàng trên cùng hoặc dưới cùng:

<RowDefinition Height="430" 
       MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/> 
Các vấn đề liên quan