Làm cách nào để có được thanh cuộn dọc trong ListBox của tôi?


83

Trong ví dụ dưới đây, tôi có một ListBox với hàng tá tên phông chữ trong đó.

Tôi đã nghĩ rằng nó sẽ tự động có một thanh cuộn dọc trên đó để bạn có thể chọn BẤT KỲ phông chữ nào, không chỉ những phông chữ đầu tiên trong danh sách, nhưng nó không.

Vì vậy, tôi đã thêm một "ScrollViewer" và điều đó đặt một "khu vực thanh cuộn" ở bên phải nhưng không có thanh cuộn trong khu vực thanh cuộn để bạn có thể cuộn (!).

Tại sao thanh cuộn không tự động và làm cách nào để buộc nó phải có thanh cuộn?

<StackPanel Name="stack1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ListBox Grid.Row="0" Name="lstFonts" Margin="3"  ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
        </ScrollViewer>
    </Grid>
</StackPanel>

Câu trả lời:


150

Vấn đề với giải pháp của bạn là bạn đang đặt một thanh cuộn quanh ListBox nơi bạn có thể muốn đặt nó vào bên trong ListBox.

Nếu bạn muốn buộc một thanh cuộn trong ListBox của mình, hãy sử dụng thuộc tính ScrollBar.VerticalScrollBarVisibility đính kèm.

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

Đặt giá trị này thành Tự động sẽ bật lên thanh cuộn khi cần thiết.


3
Trong trường hợp của tôi, tôi cũng đã đặt ListBoxbên trong một cái ScrollViewervà cái ListBoxItemsnày đang kéo dài ra ngoài kích thước mong muốn của chúng ListBox. Loại bỏ ScrollViewercài đặt ScrollViewer.VerticalScrollBarVisibility="Visible"và và ScrollViewer.HorizontalScrollBarVisibility="Disabled"đã thực hiện thủ thuật. Cảm ơn sự giúp đỡ của bạn!
quan

29

ListBoxđã chứa ScrollViewer. Theo mặc định, ScrollBarsẽ hiển thị khi có nhiều nội dung hơn không gian. Nhưng một số vùng chứa tự thay đổi kích thước để chứa nội dung của chúng (ví dụ StackPanel), vì vậy không bao giờ có "nhiều nội dung hơn không gian". Trong những trường hợp như vậy, ListBoxluôn có nhiều không gian cần thiết cho nội dung.

Để tính toán điều kiện có nhiều nội dung hơn không gian, cần phải biết kích thước. Đảm bảo rằng ListBoxkích thước của bạn có giới hạn, bằng cách đặt kích thước rõ ràng trên ListBoxchính phần tử hoặc từ bảng điều khiển máy chủ.

Trong trường hợp bảng điều khiển máy chủ theo chiều dọc StackPanelvà bạn muốn, VerticalScrollBarbạn phải tự đặt Chiều cao ListBox. Đối với các loại thùng chứa khác, ví dụ Grid, ListBoxcó thể bị ràng buộc bởi thùng chứa. Ví dụ: bạn có thể thay đổi mã gốc của mình trông như sau:

<Grid Name="grid1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Name="lstFonts" Margin="3"
                 ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
    </Grid>
</Grid>

Lưu ý rằng không phải chỉ vật chứa trước mắt mới là quan trọng. Trong ví dụ của bạn, vùng chứa trực tiếp là a Grid, nhưng vì Gridđược chứa bởi a StackPanelnên phần bên ngoài StackPanelđược mở rộng để chứa phần tử con trực tiếp của nó Grid, sao cho phần tử đó có thể mở rộng để chứa phần tử con của nó (cái ListBox).

Nếu bạn giới hạn chiều cao tại bất kỳ điểm nào - bằng cách đặt chiều cao của ListBox, bằng cách đặt chiều cao của phần bên trong Gridhoặc đơn giản bằng cách đặt phần chứa bên ngoài thành a Grid- thì thanh cuộn dọc sẽ tự động xuất hiện bất kỳ lúc nào có quá nhiều mục danh sách phù hợp với điều khiển.


Việc sử dụng DockPanel làm vùng chứa mẹ sẽ không cần biết bạn định thêm bao nhiêu phần tử khi còn nhỏ hoặc xác định trước bất kỳ Thuộc tính độ cao nào. Đối với mỗi con, xác định DockPanel.Dock = Top. Điều này làm cho "Scrollviewer-Childs" của bạn hiển thị Thanh cuộn của chúng nếu cần. Không được kiểm tra chung, nó đã hoạt động trong usecase của tôi. BR, Daniel
dba

1
TLDR: Thay đổi phần tử mẹ của bạn từ StackPanelthành Gridvì StackPanel luôn mở rộng theo chiều cao của phần tử con của nó.
Josh Noe

17

Tôi đã thêm "Chiều cao" vào ListBox của mình và nó đã thêm thanh cuộn một cách độc đáo.


8
Cố gắng tránh sử dụng các thuộc tính chiều cao và chiều rộng vì chúng có thể gây khó khăn cho các thay đổi trên đường. Bạn nên sử dụng giải pháp của JaredPar.
Bryan Anderson

1
Tôi làm điều đó nhưng nó chỉ đặt một "khu vực thanh cuộn" ở bên phải mà không có thanh cuộn nào và danh sách của tôi đi xuống phía dưới cuối cửa sổ của tôi cho đến vĩnh viễn, làm sao tôi có thể nói với hộp danh sách (dừng lại ở cuối cửa sổ )?
Edward Tanguay

15
Bởi vì nó nằm trong StackPanel, nó rất vui khi được cung cấp tất cả không gian cần thiết, vì vậy nó không nghĩ rằng nó cần thanh cuộn.
Donnelle

4

Thanh cuộn được tự động thêm vào hộp Danh sách trừ khi khả năng hiển thị của nó được đặt thành Ẩn. Bất cứ khi nào kích thước của Mục danh sách vượt quá kích thước, có thể được hiển thị bên trong hộp danh sách theo chiều dọc hoặc hộp danh sách ngang trong thời gian chạy.


1

Trong trường hợp của tôi, số lượng mục trong ListBox là động nên tôi không muốn sử dụng thuộc tính Chiều cao. Tôi đã sử dụng MaxHeight để thay thế và nó hoạt động tốt. Thanh cuộn xuất hiện khi nó lấp đầy không gian mà tôi đã phân bổ cho nó.


0

Tôi đang gặp vấn đề tương tự, tôi có ComboBox theo sau là ListBox trong StackPanel và thanh cuộn cho ListBox không hiển thị. Thay vào đó, tôi đã giải quyết vấn đề này bằng cách đưa cả hai vào DockPanel. Tôi đặt ComboBox DockPanel.Dock = "Top" và để ListBox lấp đầy khoảng trống còn lại.


0

XAML ListBox Scroller - Windows 10 (UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>

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.