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

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>



답변

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

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


답변

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

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

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


답변

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

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]


답변