내 ListBox에서 수직 스크롤바를 어떻게 얻을 수 있습니까?


84

아래 예제에는 수십 개의 글꼴 이름이있는 ListBox가 있습니다.

목록의 첫 번째 글꼴뿐만 아니라 모든 글꼴을 선택할 수 있도록 자동으로 세로 스크롤바가있을 것이라고 생각했을 것입니다.

그래서 "ScrollViewer"를 추가했는데 오른쪽에 "스크롤바 영역"이 있지만 스크롤바 영역에 스크롤바가 없어서 스크롤 (!) 할 수 있습니다.

스크롤바가 자동으로되지 않는 이유는 무엇이며 어떻게 강제로 스크롤바를 갖도록합니까?

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

답변:


151

솔루션의 문제는 ListBox 내부에 배치하려는 ListBox 주위에 스크롤 막대를 배치한다는 것입니다.

ListBox에 스크롤바를 강제로 적용하려면 ScrollBar.VerticalScrollBarVisibility 연결된 속성을 사용하십시오.

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

이 값을 Auto로 설정하면 필요에 따라 스크롤바가 팝업됩니다.


3
내 경우에는 ListBox내부 ScrollViewerListBoxItems넣었고 ListBox. 제거 ScrollViewer및 설정 ScrollViewer.VerticalScrollBarVisibility="Visible"ScrollViewer.HorizontalScrollBarVisibility="Disabled"트릭은 않았다. 도와 주셔서 감사합니다!
만다린

30

ListBox이미 포함되어 있습니다 ScrollViewer. 기본적으로 ScrollBar공간보다 콘텐츠가 더 많을 때 표시됩니다. 그러나 일부 컨테이너는 내용을 수용하기 위해 자체 크기를 조정 StackPanel하므로 (예 :) "공간보다 더 많은 내용"은 없습니다. 이러한 경우에는 ListBox항상 콘텐츠에 필요한만큼의 공간이 제공됩니다.

공간보다 콘텐츠가 더 많은 조건을 계산하려면 크기를 알아야합니다. 요소 자체 또는 호스트 패널에서 ListBox명시 적으로 크기를 설정하여 제한된 크기 인지 확인하십시오 ListBox.

호스트 패널이 수직 StackPanel이고 원하는 경우 자체적으로 VerticalScrollBar높이를 설정해야 ListBox합니다. 예를 들어, 용기의 다른 유형 Grid은이 ListBox컨테이너에 의해 제한 될 수있다. 예를 들어 원본 코드를 다음과 같이 변경할 수 있습니다.

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

중요한 것은 즉각적인 컨테이너가 아닙니다. 귀하의 예에서 직접 컨테이너는 Grid이지만 Grid에 포함되어 있기 때문에 StackPanel외부 StackPanel는 직계 자식 Grid을 수용 하도록 확장되어 자식이 자식 ( ListBox) 을 수용 하도록 확장 할 수 있습니다 .

의 높이를 ListBox설정 Grid하거나 내부의 높이를 설정 하거나 단순히 외부 컨테이너를 a 로 설정하여 어느 지점에서든 높이를 제한하면 Grid목록 항목이 너무 많을 때마다 자동으로 세로 스크롤 막대가 나타납니다. 컨트롤에 적합합니다.


DockPanel을 부모 컨테이너로 사용하면 자식으로 추가하거나 높이 속성을 미리 정의하려는 요소 수를 알 필요가 없습니다. 각 자식에 대해 DockPanel.Dock = Top을 정의합니다. 이렇게하면 "Scrollviewer-Childs"가 필요에 따라 스크롤바를 표시합니다. 일반적으로 테스트되지 않았으며 내 사용 사례에서 작동했습니다. BR, Daniel
dba

1
TLDR : StackPanel은 항상 자식의 높이로 확장되므로 부모 요소를에서 StackPanel로 변경하십시오 Grid.
Josh Noe

17

내 ListBox에 "Height"를 추가했고 스크롤바를 멋지게 추가했습니다.


8
높이 및 너비 속성은 도로 변경을 어렵게 만들 수 있으므로 사용하지 마십시오. JaredPar의 솔루션을 사용하는 것이 좋습니다.
Bryan Anderson

1
나는 그렇게하지만 스크롤바 자체없이 오른쪽에 "스크롤바 영역"을 배치하고 내 목록은 내 창 하단을지나 영원까지 내려갑니다. 어떻게 목록 상자에 알릴 수 있습니까 (창 하단에서 중지) )?
Edward Tanguay

15
StackPanel에 있기 때문에 필요한 모든 공간이 기꺼이 제공되므로 스크롤바가 필요 하다고 생각하지 않습니다 .
Donnelle

4

스크롤 막대는 가시성이 숨김으로 설정되어 있지 않으면 목록 상자에 자동으로 추가됩니다. 목록 항목의 크기가 크기를 초과 할 때마다 목록 상자 내부에 세로 또는 가로 목록 상자가 표시 될 수 있으며 런타임 중에 볼 수 있습니다.


1

제 경우에는 ListBox의 항목 수가 동적이므로 Height 속성을 사용하고 싶지 않았습니다. 대신 MaxHeight를 사용했고 잘 작동합니다. 스크롤바는 내가 할당 한 공간을 채울 때 나타납니다.


0

같은 문제가 발생하여 ComboBox와 StackPanel에 ListBox가 있고 ListBox의 스크롤 막대가 표시되지 않았습니다. 대신 DockPanel에 두 개를 넣어이 문제를 해결했습니다. ComboBox DockPanel.Dock = "Top"을 설정하고 ListBox가 나머지 공간을 채우도록합니다.


0

XAML 목록 상자 스크롤러-Windows 10 (UWP)

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.