WPF: Пункти керування за допомогою панелі прокрутки (ScrollViewer)


128

Я дотримувався цього невеликого "підручника" про те, як додати панель прокрутки до елемента "ItemControl", і він працює в режимі "Дизайнер", але не тоді, коли я компілюю та виконую програму (відображаються лише перші кілька елементів, і жодна смуга прокрутки, щоб переглянути більше - навіть коли для VerticalScrollbarVisibility встановлено значення "Visible" замість "Auto").

Будь-яка ідея, як це вирішити?


Це код, який я використовую для показу своїх елементів (зазвичай я працюю з прив'язкою даних, але щоб побачити елементи в своєму конструкторі, я додав їх вручну):

<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.
Крістофер Летте

3
Дякую - дуже корисно. Я погоджуюся з Летте, що мій мозок WinForms не "отримує" це спочатку.
itsmatt

1
Я просто спробував це тут, і це все ще не вийшло. ItemControl тече прямо з його батьківського контейнера, і жоден ScrollBar не видно.
Рістогод

8
@Ristogod Якщо ви розмістите ScrollViewer всередині чогось, що дозволяє його вмісту рости стільки, скільки потрібно, наприклад StackPanel, прокрутка не працюватиме. Що таке батьківський контейнер? Спробуйте встановити фіксовану висоту або на ScrollViewer, або на батьківську, чи допомагає це?
Оскар

4
@Rod Ви можете розмістити ScrollViewer в DockPanel або Grid замість StackPanel, щоб досягти цього.
Оскар

79

Ви повинні змінити шаблон управління замість ItemPanelTemplate:

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

Можливо, ваш код не працює, оскільки StackPanel має власну функцію прокрутки. Спробуйте використовувати властивість StackPanel.CanVerticalScroll .


1
Боюся, властивість StackPanel CanVericallyScroll не працювала.
Xuntar

StackPanel CanVericallyScroll не працював, але приклад коду, наведений тут, працював для мене. Спасибі
Сувік Басу

Це працює. Я шукаю, щоб зробити прокручувач всередині замість зовні, тому що цього вимагає github.com/punker76/gong-wpf-dragdrop .
HelloSam

3

Помістіть свій ScrollViewer в DockPanel і встановіть властивість DockPanel MaxHeight

[...]
<DockPanel MaxHeight="700">
  <ScrollViewer VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemSource ="{Binding ...}">
     [...]
   </ItemsControl>
  </ScrollViewer>
</DockPanel>
[...]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.