WPF:スクロールバー付きのItemsControl(ScrollViewer)


128

私は、その後、この私がプログラム(のみの最初のいくつかの項目が表示され、より表示していないスクロールバーをコンパイルして実行するときのItemsControlにスクロールバーを追加する方法に小さな「チュートリアル」、そしてそれがデザイナービューで動作しますが、ではない-でも、 VerticalScrollbarVisibilityが「Auto」ではなく「Visible」に設定されている場合)。

これを解決する方法について何か考えはありますか?


これは、アイテムを表示するために使用するコードです(通常はDatabindingで作業しますが、デザイナーでアイテムを表示するには、手動で追加しました)。

<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フォームから来ているので、私はしばしば自分が間違った考え方で立ち往生していることに気づきます。WPFは多くの誤りを認めているようです... +1。
Christoffer Lette、2010年

3
ありがとうございました。私のWinFormsの頭脳が最初はこれを「取得」しないことに同意します。
itsmatt

1
私はこれをここで試してみましたが、それでも機能しませんでした。ItemsControlはその親コン​​テナのすぐ外を流れ、ScrollBarはまったく表示されません。
リストゴッド

8
@Ristogodたとえば、StackPanelのようにコンテンツを必要なだけ拡大できる何かの中にScrollViewerをホストすると、スクロールは機能しません。親コンテナは何ですか?ScrollViewerまたは親のいずれかに固定の高さを設定してみてください、それは役に立ちますか?
オスカー

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 2013

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.