your programing

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

lovepro 2020. 10. 9. 11:31
반응형

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


아래 예제에는 수십 개의 글꼴 이름이있는 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>

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

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

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

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


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목록 항목이 너무 많을 때마다 자동으로 세로 스크롤 막대가 나타납니다. 컨트롤에 적합합니다.


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


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


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


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


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

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

참고 URL : https://stackoverflow.com/questions/472796/how-can-i-get-a-vertical-scrollbar-in-my-listbox

반응형