2009-11-09 19 views
7

Tôi đang cố gắng để làm cho các căng thẳng đứng để làm việc như mong đợi tôi WPF, nhưng đối với một số lý do nó chỉ mất không gian cần thiết, và không phải là không gian có sẵn.WPF, Bắt verticalstretch hoạt động như mong đợi!

Trước tiên, tôi đang sử dụng WPF với C# và Prism.

Trong Shell.xaml (chính xaml cho ứng dụng), tôi có một lưới với 2 cột và một hàng. Ý tưởng là để có một bảng điều khiển bên và một khu vực ứng dụng chính. Lưới khu vực ứng dụng chính được đặt thành Chiều rộng tự động và Chiều cao tự động. Điều này làm việc như mong đợi, và nó có quy mô để phù hợp với toàn bộ ứng dụng trong Chiều cao và Chiều rộng.

Sau đó, tôi đang sử dụng lăng kính để chèn chế độ xem (dưới dạng thành phần UserControl) vào vùng ứng dụng chính. UserControl cũng được đặt thành Auto Width và Height, và bằng cách nhìn vào các thiết lập mặc định trong Expression Blend, HorizontalAlignment và VerticalAlignment được thiết lập để kéo dài!

Tuy nhiên, tính năng UserControl tải lăng kính chỉ kéo dài theo Chiều rộng và không cao! Bằng cách cho màu nền này cho phản hồi trực quan, tôi có thể thấy rằng nó chỉ chiếm không gian dọc khi cần thiết và không phải toàn bộ khu vực có sẵn!

Giải pháp này có thể là giải pháp gì? Tôi đã cố gắng đi trough tất cả các thiết lập một cách thủ công ghi đè chúng để chiều rộng và chiều cao tự động, ngang và thẳng đứng Alignment để Stretch, nhưng không có gì có vẻ làm việc như mong đợi!

Một số mã: (Shell.xaml)

<Window Height="1140" Width="1450"> 
    <Grid Margin="0" Background="White"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="250" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Grid Background="#FFEEEEEE" Grid.Column="0" Grid.Row="0"> 
      </Grid>   
      <ItemsControl Width="Auto" Height="Auto" Grid.Row="0" Grid.Column="1" Name="MainRegion" cal:RegionManager.RegionName="MainRegion" Padding="10" Margin="10, 0, 0, 0" Background="#FFFFFFD5" /> 
     </Grid> 
    </Grid> 
</Window> 

(quan điểm cho rằng nên thừa hưởng chiều cao mẹ):

<UserControl Width="Auto" Height="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <!-- I want this to take the full width and height of the parent --> 
</UserControl> 

Vì vậy, đây là một limitaion trong cách các quan điểm được nạp vào xaml chính, hay đây là giới hạn UserControl, hay cái gì khác mà tôi không hiểu?

Chỉ cần làm rõ; Tôi thấy màu nền của ItemsControl được định nghĩa trong Shell.xaml kéo dài cả Horizontal và Vertical, nhưng không phải là nền của khung nhìn được nạp vào ItemsControl.

Lưu ý rằng tôi đã xóa một số xaml để làm cho điểm dễ hiểu hơn!

Cảm ơn!

Trả lời

8

Tôi đã tìm thấy giải pháp. Tôi phải ghi đè Mẫu ItemsPanel sử dụng một mạng lưới (hoặc container tương tự):

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid/> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Tôi cũng trong trường hợp này loại bỏ một số XAML để làm cho nó readble nhiều hơn nữa!

Cảm ơn

+0

Bạn có thể đánh dấu mục này làm câu trả lời. –

+0

có, trong một ngày vì đó là câu trả lời của riêng tôi –

+0

Nếu bạn chỉ hiển thị một mục tại sao không sử dụng ContentControl thay vì một ItemsControl. Giả sử rằng bạn không cố tình đặt một số vật phẩm lên nhau. – jpierson

1

Bạn đã thử đặt HorizontalContentAlignment và VerticalContentAlignment thành Stretch trong ItemsControl?

+0

Có, tôi có, nhưng không có sự khác biệt! Stretch là giá trị mặc định cho HorizontalContentAlignment và VerticalContentAlignment trong ItemsControl, nhưng tôi cũng đã cố gắng ghi đè cả hai với vaule Stretch! –

+2

Tôi cũng sẽ loại bỏ các ô tô; Các liên kết nên đặt chiều rộng và chiều cao. Ngoài ra, vào thời gian chạy, bạn đã kiểm tra cây thị giác của mình với Mole hay một trong những vòng lặp wpf? – Will

+0

Tôi sẽ nhìn vào Mole hoặc một cái gì đó tương tự như họ có thể là một hỗ trợ tuyệt vời trong các trường hợp như thế này! –

10

Giá trị mặc định cho ItemsControl.ItemsPanelTemplateStackPanel, mà nén tất cả các con của nó theo chiều dọc cho các triệu chứng bạn mô tả.

Đoạn mã giải pháp đã thay đổi điều này thành <Grid>. Điều này sẽ hoạt động tốt miễn là chỉ có một chế độ xem trong khu vực.Nhưng nếu khu vực có nhiều hơn một lượt xem, tất cả chúng sẽ được đặt trên đầu trang của nhau thay vì bên cạnh nhau.

Nếu bạn muốn có một khu vực có thể xử lý nhiều quan điểm nhưng cho phép xem để kéo dài đến kích thước đầy đủ của khu vực, sử dụng một DockPanel thay vì:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <DockPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Điều này sẽ đặt quan điểm đầu tiên trong một bảng điều khiển trên bên trái, cái tiếp theo bên cạnh nó, và cứ như vậy cho đến khi khung nhìn cuối cùng sẽ lấp đầy tất cả không gian còn lại.

Nếu bạn muốn có nhiều quan điểm ngăn xếp theo chiều dọc như họ đã làm với StackPanel, bạn sẽ phải thiết lập khả năng trong ItemContainerStyle:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <DockPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="DockPanel.Dock" Value="Top" /> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 
+0

Cảm ơn thông tin tuyệt vời này! Tôi sẽ cần phải đánh giá những thành phần loại og để sử dụng trong ITemsControl, nhưng bây giờ tôi đang sử dụng một Grid và trong UserControl tôi đang sử dụng một DockPanel. Bằng cách này, tôi nghĩ rằng UserControl có quyền kiểm soát cao hơn bố cục của riêng mình, nhưng điều này sẽ phụ thuộc vào nhu cầu. Cảm ơn Ray –

+0

@Will - PERFECT Tôi đã cố gắng giải quyết vấn đề này trong hai ngày. @ code-zoop nên đánh dấu phần này là câu trả lời. May mắn thay, tôi nghĩ sẽ quay lại và đọc thêm sau khi tôi thực hiện câu trả lời của anh ấy và có vấn đề bạn vừa giải quyết. Tôi vẫn vui mừng code-zoop hỏi câu hỏi. – Tod

Các vấn đề liên quan