WPF: Kaydırma çubuklu ItemsControl (ScrollViewer)


128

Bir ItemsControl'e bir kaydırma çubuğunun nasıl ekleneceğine dair bu küçük "öğreticiyi" takip ettim ve Tasarımcı görünümünde çalışıyor, ancak programı derleyip çalıştırdığımda değil (yalnızca ilk birkaç öğe görünüyor ve daha fazlasını görüntülemek için kaydırma çubuğu yok) VerticalScrollbarVisibility "Otomatik" yerine "Görünür" olarak ayarlandığında).

Bunu nasıl çözeceğime dair bir fikrin var mı?


Öğelerimi göstermek için kullandığım kod budur (normalde Veri Bağlama ile çalışıyorum, ancak Tasarımcımdaki öğeleri görmek için onları manuel olarak ekledim):

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

Ve bu benim Şablonum:

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

Yanıtlar:


261

Bir kaydırma çubuğuna sahip olmak için ItemsControl, onu şu şekilde barındırabilirsiniz ScrollViewer:

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

16
Gördüğünüzde çok açık ... Windows Forms'tan geldiğim için, sık sık kendimi yanlış zihniyette sıkışmış buluyorum. Görünüşe göre WPF bir çok yanlışı hak ediyor ... +1.
Christoffer Lette

3
Teşekkürler -çok yardımcı oldu. WinForms beynimin bunu başlangıçta "anlamadığı" konusunda Lette'e katılıyorum.
itsmatt

1
Bunu burada denedim ve hala işe yaramadı. ItemsControl üst kapsayıcısından akar ve hiçbir ScrollBar görünmez.
Ristogod

8
@Ristogod ScrollViewer'ı içeriğinin gerektiği kadar büyümesine izin veren bir şeyin içinde barındırırsanız, örneğin bir StackPanel, kaydırma çalışmayacaktır. Üst kapsayıcı nedir? ScrollViewer'da veya ebeveynde sabit bir yükseklik ayarlamayı deneyin, bu yardımcı olur mu?
Oskar

4
@Rod Bunu başarmak için ScrollViewer'ı StackPanel yerine bir DockPanel veya Grid'de barındırabilirsiniz.
Oskar

79

ItemsPanelTemplate yerine kontrol şablonunu değiştirmeniz gerekir:

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

StackPanel'in kendi kaydırma işlevi olduğundan kodunuz çalışmıyor olabilir. StackPanel.CanVerticallyScroll özelliğini kullanmayı deneyin .


1
Korkarım StackPanel CanVerticallyScroll özelliği çalışmadı.
Xuntar

StackPanel CanVerticallyScroll çalışmadı, ancak burada verilen kod örneği benim için çalıştı. Teşekkürler
Souvik Basu

Bu çalışıyor. Github.com/punker76/gong-wpf-dragdrop bunu gerektirdiği için dışarıdan değil içeride scrollviewer yapmak istiyorum.
HelloSam

3

ScrollViewer'ınızı bir DockPanel'e yerleştirin ve DockPanel MaxHeight özelliğini ayarlayın

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.