WPF: ItemControl với thanh cuộn (ScrollViewer)


128

Tôi đã làm theo "hướng dẫn" nhỏ này về cách thêm thanh cuộn vào ItemControl và nó hoạt động trong chế độ xem Designer, nhưng không phải khi tôi biên dịch và thực thi chương trình (chỉ một vài mục đầu tiên xuất hiện và không có thanh cuộn nào để xem thêm - thậm chí khi verticalScrollbarVisibility được đặt thành "Hiển thị" thay vì "Tự động").

Bất kỳ ý tưởng về làm thế nào để giải quyết điều này?


Đây là mã tôi sử dụng để hiển thị các mục của mình (thông thường tôi làm việc với Databinding, nhưng để xem các mục trong Trình thiết kế của tôi, tôi đã thêm chúng theo cách thủ công):

<ItemsControl x:Name="itemCtrl" Style="{DynamicResource UsersControlStyle}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top">
            </StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
</ItemsControl>

Và đây là Mẫu của tôi:

<Style x:Key="UsersControlStyle" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                    <ScrollViewer VerticalScrollBarVisibility="Visible">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Câu trả lời:


261

Để có được một thanh cuộn cho một ItemsControl, bạn có thể lưu trữ nó ScrollViewernhư thế này:

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <ItemsControl>
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
  </ItemsControl>
</ScrollViewer>

16
Thật rõ ràng khi bạn nhìn thấy nó ... Khi tôi đến từ Windows Forms, tôi thường thấy mình bị mắc kẹt trong suy nghĩ sai lầm. Có vẻ như quyền WPF có rất nhiều sai ... +1.
Christoffer Lette

3
Cảm ơn - rất hữu ích. Tôi đồng ý với Lette rằng bộ não WinForms của tôi ban đầu không "hiểu" điều này.
itmatt

1
Tôi mới thử cái này ngay tại đây và nó vẫn không hoạt động. ItemControl chảy ngay ra khỏi bộ chứa mẹ của nó và không có ScrollBar nào hiển thị cả.
Ristogod

8
@Ristogod Nếu bạn lưu trữ ScrollViewer bên trong thứ gì đó cho phép nội dung của nó phát triển hết mức cần thiết, ví dụ như StackPanel, cuộn sẽ không hoạt động. Container mẹ là gì? Hãy thử đặt chiều cao cố định trên ScrollViewer hoặc cha mẹ, điều đó có giúp ích gì không?
Oskar

4
@Rod Bạn có thể lưu trữ ScrollViewer trong DockPanel hoặc Grid thay vì StackPanel để đạt được điều này.
Oskar

79

Bạn phải sửa đổi mẫu điều khiển thay vì ItemPanelTemplate:

<ItemsControl >
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}">
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

Có thể, mã của bạn không hoạt động vì StackPanel có chức năng cuộn riêng. Hãy thử sử dụng thuộc tính StackPanel.CanVert VềScroll .


1
Thuộc tính StackPanel CanVert VềScroll không hoạt động, tôi sợ.
Xuntar

StackPanel CanVert VềScroll không hoạt động nhưng ví dụ mã được đưa ra ở đây làm việc cho tôi. Cảm ơn
Souvik Basu

Những công việc này. Tôi đang tìm kiếm để tạo scrollviewer bên trong thay vì bên ngoài, bởi vì github.com/punker76/gong-wpf-dragdrop yêu cầu nó.
HelloSam

3

Đặt ScrollViewer của bạn vào DockPanel và đặt thuộc tính DockPanel MaxHeight

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.