2009-07-15 44 views
26

Tôi đang sử dụng một điều khiển scrollviewer xung quanh bảng ngăn xếp của tôi có chứa một ItemsControl. Khi có nhiều mục trong ItemsControl, nó giả sử để cuộn nhưng vì một số lý do nó chỉ cắt các mục. Đây là mã:ScrollViewer không cuộn trong WPF

<StackPanel> 
    <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible"> 
     <ItemsControl Name="icEvents" Width="Auto" Height="100" Background="AliceBlue" 
         ItemsSource="{Binding Path=EventSources}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="Source:"/> 
         <TextBlock Text="{Binding Path=Source}" /> 
         <TextBlock Text="Original Source:"/> 
         <TextBlock Text="{Binding Path=OriginalSource}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

Trả lời

40

Thử lưới xung quanh ScrollViwer của bạn thay vì StackPanel. Tôi nghĩ rằng StackPanel sẽ cung cấp nhiều chiều cao như nội dung mong muốn, do đó, tại đây Scrollviwer không hoạt động bình thường vì chiều cao của nó không bị hạn chế bởi kiểm soát gốc.

Bạn có thể hiểu vấn đề từ ví dụ bên dưới.

<StackPanel> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

Mã trên tương tự như của bạn và nó không cung cấp cho bạn thanh cuộn. Nhưng xem mã dưới đây, trong đó tôi chỉ thay đổi StackPanel đến một Grid (panel Bất kỳ mà tôn trọng kích thước của con của nó dựa trên kích thước tấm nhưng stackpanel không)

<Grid> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 

CẬP NHẬT: Nhưng nếu bạn thực sự cần phải sử dụng StackPanel sau đó bạn có thể cần phải thiết lập kích thước cho ScrollViwer của bạn để có được nội dung cuộn

+0

Điều này có thể không thực hiện được vì mọi thứ đều nằm trong StackPanel. KHÔNG có lưới trên trang. Chỉ stackpanel chính có chứa hai stackpanels khác. Điều này thậm chí xảy ra khi tôi nói chiều cao của stackpanel giống như 100. – azamsharp

+0

Vấn đề là mọi điều khiển trên Cửa sổ đều nằm trong bảng điều khiển ngăn xếp chính. azamsharp

+2

Nhưng nếu bạn thực sự cần phải sử dụng StackPanel sau đó bạn có thể cần phải thiết lập kích thước cho ScrollViwer của bạn để có được những cuộn nội dung, vì như tôi đã nói trước đó một StackPanel doesnt tôn trọng chiều cao con của nó hay chiều rộng. Vì vậy, chúng ta phải thiết lập một chiều cao và chiều rộng khi chúng ta sử dụng StackPanel –

2

Các ItemsControl nên chứa ScrollViewer, không phải là cách khác xung quanh. Tất cả những gì mà ScrollViewer biết là bản thân số ItemsControl trong trường hợp của bạn - nó không biết về các vật dụng bên trong.

Hãy thử một cái gì đó như thế này:

<ItemsControl Name="icEvents" Width="Auto" Height="100" 
    Background="AliceBlue" 
    ItemsSource="{Binding Path=EventSources}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="Source:"/> 
       <TextBlock Text="{Binding Path=Source}" /> 
       <TextBlock Text="Original Source:"/> 
       <TextBlock Text="{Binding Path=OriginalSource}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.Template> 
     <ControlTemplate TargetType="ItemsControl"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ItemsPresenter Margin="5" /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 
+0

Nó không phải là cần thiết để có một scrollviwer, vấn đề trong câu hỏi là StackPanel. –

+1

Bạn cần một ScrollViewer ở đâu đó, mặc dù, bởi mặc định ItemsControl không cuộn. Tôi đã sử dụng mã này và nó hoạt động, mặc dù câu trả lời của bạn có thể sẽ hoạt động tốt. – Andy

+0

Yeah mã của bạn cũng chỉ hoạt động nếu anh ta loại bỏ StackPanel bên ngoài và nó không quan trọng bạn có một thanh cuộn bên trong ControlTemplate hoặc bên ngoài của ItemsControl cả hai là gần như giống nhau. –

21

bạn phải sửa Chiều cao của ScrollViewer, nhưng có thể dễ dàng liên kết với StackPanel ActualHeight:
(thử nghiệm code)

<StackPanel Name="mypanel"> 
    <ScrollViewer Height="{Binding ElementName=mypanel, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

Hoặc tốt hơn, nếu bạn không thể thay đổi tên của StackPanel:

<StackPanel> 
    <ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type StackPanel}}, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

Nó là một "Trước tiên, bạn" vấn đề, StackPanel hỏi ScrollViewer cho Chiều cao và ScrollViewer hỏi StackPanel cho chiều cao tối đa nó có thể được.

+2

Cảm ơn câu trả lời đầy đủ thông tin! Điều này chắc chắn sẽ có ích! – azamsharp

+0

Câu trả lời hay, làm việc như một sự quyến rũ! – Jlange

0

Cuộn cần phải là cha mẹ của con đang thay đổi kích thước, hãy đặt điều khiển thay đổi kích thước (trong trường hợp này là ngăn xếp ngăn xếp) bên trong nó.

<ScrollViewer> 
    <StackPanel> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
    </StackPanel> 

0

Tôi đã có một vấn đề nhờ đó mà tôi đã giới thiệu một ItemsControl trong một lưới điện và để xem các thanh cuộn, tôi đã phải từ bỏ này tế bào Lưới * chiều cao -sized.

Tuy nhiên, điều này có nghĩa là ItemsControl luôn lấp đầy ô ngay cả khi chỉ có một vài giá trị.

Tôi muốn ItemsControl chỉ đủ lớn để hiển thị những gì nó có nhưng nếu có quá nhiều mục thì tôi muốn cuộn. Theo thứ tự từ tôi muốn điều này để làm việc chỉ bất kỳ màn hình kích thước.

mã trong sự kiện Loaded này đã làm việc cho tôi:

Size x = new Size(double.PositiveInfinity, double.PositiveInfinity); 
myItemscontrol.Measure(x); 
Các vấn đề liên quan