WPF : 스크롤 막대가있는 ItemsControl (ScrollViewer)


128

ItemsControl에 스크롤 막대를 추가하는 방법에 대한 작은 "자습서"를 따랐 으며 Designer보기에서는 작동하지만 프로그램을 컴파일하고 실행할 때 (첫 번째 몇 항목 만 표시되고 더 이상 볼 스크롤 막대는 표시되지 않음) VerticalScrollbarVisibility가 "Auto"대신 "Visible"로 설정된 경우)

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?


이것은 내 항목을 표시하는 데 사용하는 코드입니다 (일반적으로 데이터 바인딩으로 작업하지만 디자이너에서 항목을 보려면 수동으로 추가했습니다).

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

그리고 이것은 내 템플릿입니다.

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

답변:


261

에 대한 스크롤 막대를 얻으려면 ItemsControl다음 ScrollViewer과 같이 호스팅 할 수 있습니다 .

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

16
당신이 그것을 볼 때 너무 분명하다 ... 내가 Windows Forms에서 왔을 때, 나는 종종 자신이 잘못된 사고 방식에 갇혀 찾을 수 있습니다. WPF의 권리에는 많은 잘못이있는 것 같습니다 ... +1.
Christoffer Lette

3
고마워-매우 도움이되었습니다. 저는 Winettes 두뇌가 처음에 이것을 "받지"않는다는 Lette에 동의합니다.
itsmatt

1
방금 이것을 시도했지만 여전히 작동하지 않았습니다. ItemsControl은 부모 컨테이너에서 바로 흐르며 ScrollBar가 전혀 표시되지 않습니다.
Ristogod

8
@Ristogod StackPanel과 같이 내용이 필요한만큼 커질 수있는 내용으로 ScrollViewer를 호스팅하면 스크롤이 작동하지 않습니다. 부모 컨테이너는 무엇입니까? ScrollViewer 또는 부모에서 고정 높이를 설정해보십시오. 도움이 되나요?
Oskar

4
@Rod StackPanel 대신 DockPanel 또는 Grid에서 ScrollViewer를 호스팅하여이 작업을 수행 할 수 있습니다.
Oskar

79

ItemsPanelTemplate 대신 컨트롤 템플릿을 수정해야합니다.

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

StackPanel에는 자체 스크롤 기능이 있으므로 코드가 작동하지 않을 수 있습니다. StackPanel.CanVerticallyScroll 속성을 사용해보십시오 .


1
StackPanel CanVerticallyScroll 속성이 작동하지 않아서 두렵습니다.
Xuntar

StackPanel CanVerticallyScroll이 작동하지 않았지만 여기에 주어진 코드 예제가 저에게 효과적이었습니다. 감사합니다
Souvik Basu

작동합니다. github.com/punker76/gong-wpf-dragdrop에 필요 하기 때문에 외부가 아닌 내부에 scrollviewer를 만들고 싶습니다 .
HelloSam

3

ScrollViewer를 DockPanel에 넣고 DockPanel MaxHeight 속성을 설정하십시오.

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.