Полоса прокрутки в списке не работает

У меня есть ListBox, который отображает список элементов управления WPF. Моя проблема в том, что вертикальная полоса прокрутки отображается, но отключена, даже если элементов достаточно, чтобы ListBox можно было прокручивать. Еще один, возможно, важный факт заключается в том, что это содержится в файле Integration.ElementHost.

Новичок в WPF, Джим

Вот XAML для ListBox:

  // for brevity I removed the Margin and Tooltip attributes

  <Grid x:Class="Xyzzy.NoteListDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Name="stackPanel" Orientation="Vertical"
                ScrollViewer.VerticalScrollBarVisibility="Visible">
        <StackPanel Orientation="Horizontal">
            <CheckBox Name="AllRecent" IsChecked="False" >View All Recent</CheckBox>
            <CheckBox Name="AscendingOrder" IsChecked="False">Descending Order</CheckBox>
            <Button Name="btnTextCopy" Click="btnCopyText_Click">Copy All</Button>
        </StackPanel>
        <ListBox Name="NoteList"
                 ScrollViewer.CanContentScroll="True"
                 ScrollViewer.VerticalScrollBarVisibility="Visible">
        </ListBox>
      </StackPanel>
  </Grid>

И XAML для элемента управления, отображаемого в каждом элементе ListBox:

  <UserControl x:Class="Xyzzy.NoteDisplay"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
      <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
          <TextBlock Name="Heading" FontSize="10">Note Heading</TextBlock>
          <Button Name="btnCopyText" Height="20" FontSize="12"
                          Click="btnCopyText_Click">Copy
          </Button>
        </StackPanel>
        <TextBlock Name="Body" FontSize="14">Note Body</TextBlock>
      </StackPanel>
    </Grid>
  </UserControl>

person Jim Reineri    schedule 12.08.2009    source источник


Ответы (8)


У меня были проблемы с видимостью полосы прокрутки при использовании StackPanel. Я думаю, это потому, что StackPanel всегда настолько велик, насколько это необходимо, чтобы содержать всех своих дочерних элементов. Попробуйте реорганизовать макет, чтобы удалить StackPanel (вместо него используйте Grid), и посмотрите, поможет ли это.

person John Myczek    schedule 12.08.2009
comment
Когда я поместил Listbox в Grid, а не в StackPanel, проблема исчезла. Я это ошибка кода WPF, ошибка дизайна WPF или преднамеренное поведение WPF ?? - person Jim Reineri; 12.08.2009
comment
Я думаю, именно так работает StackPanel. В вашем случае StackPanel был такой высоты, какой должен был быть ListBox без прокрутки, тогда StackPanel обрезался внизу. - person John Myczek; 12.08.2009
comment
Да, проблема связана со StackPanel, и проблема решается с помощью Grid. Спасибо @JohnMyczek - person Mohsen Afshin; 14.01.2013
comment
Ideed - у меня была такая же проблема, и я решил ее, удалив панель стека. - person Zitun; 17.07.2014
comment
Если решение сетки не работает сразу, установите <RowDefinition Height="*" /> для строки, содержащей ListBox. - person Pollitzer; 13.12.2015
comment
ты издеваешься надо мной?? Я только что потратил 5 часов, пытаясь понять, почему мой список не работает, и вот оно. Спасибо! - person Zonus; 15.01.2021

Вам просто нужно ввести свойство Height, например:

<ListBox Height="200" 
         Name="NoteList"
         ScrollViewer.CanContentScroll="True"
         ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
person Mert Akcakaya    schedule 04.10.2013
comment
Подтверждено, что это решение работает с StackPanel, несмотря на то, что в принятом ответе упоминается иное. Кроме того, параметр «Видимость» можно изменить на «Авто», чтобы полоса прокрутки отображалась только при необходимости. И высота может быть изменена на MinHeight. - person Michel Keijzers; 15.01.2021
comment
@MichelKeijzers - Жесткое кодирование высоты работает только до тех пор, пока вы не можете ничего изменить. Как только кто-то изменяет размер окна, это не удается. Вы должны сделать это таким образом, чтобы размер автоматически изменялся. - person MBentley; 12.03.2021

Эй, я подозреваю, что может происходить то, что ваш ListBox достаточно расширяется для каждого элемента, однако ListBox фактически исчезает из нижней части содержащего элемента управления.

Действительно ли ListBox останавливается правильно или кажется, что он просто исчезает? Попробуйте установить MaxHeight в ListBox и посмотрите, появится ли при этом полоса прокрутки. Вы должны иметь возможность установить для VerticalScrollBarVisibility значение Auto, чтобы оно появлялось только при необходимости.

person Community    schedule 12.08.2009
comment
Я должен был упомянуть, что пытался ограничить размер списка точно так, как вы предлагаете. В результате улучшения не было. - person Jim Reineri; 12.08.2009
comment
Рэйч была права в моем случае. Контроль просто расширился и просто исчез за пределами моего контроля. Раньше у меня был ListBox в строке/столбце сетки с шириной/высотой, установленной на Авто. Как только они были установлены на «*», ListBox начал вести себя. - person AlexeiOst; 13.07.2018

Если поле со списком находится внутри StackPanel, попробуйте выполнить следующие действия для своего ListBox.

  1. Установите ScrollViewer.VerticalScrollBarVisibility = "Авто"
  2. Установка свойства Height ListBox на некоторую высоту, которую вы ожидаете увидеть.

Это должно заставить полосу прокрутки появиться.

person AustinTX    schedule 19.10.2012

Это довольно поздно, но любой, кто использует ListBox, вероятно, не должен иметь его в StackPanel. Как только я переключил родительский элемент управления моего списка со StackPanel на DockPanel с LastChildFill=True (где список был последним элементом управления), моя полоса прокрутки заработала отлично.

Надеюсь, это поможет кому-то, чья проблема не была решена с помощью приведенного выше ответа.

person Rachael    schedule 07.02.2013

Другое решение этой проблемы, которое хорошо работает, состоит в том, чтобы поместить ScrollViewer вокруг StackPanel.

person AJH    schedule 17.05.2012

Другое решение с модификацией Дейва — использовать только ScrollViewer. Вы сможете прокручивать, только поместив указатель мыши на полосу прокрутки ScrollView. Я использую его таким образом, потому что мне не нравится, как ListBox перескакивает с элемента на элемент и иногда пропускает элементы сверху. Немного тяжеловат и для глаз. Мне нравится плавная прокрутка ScrollViewer.

person VcDeveloper    schedule 26.09.2013
comment
Просто прочитайте этот пост, чтобы добавить прокрутку, когда мышь находится над ListBox. stackoverflow.com/questions/2976240/ - person VcDeveloper; 26.09.2013

Я только что столкнулся с той же проблемой, и вот небольшая демонстрация кода в проекте кода, которая наглядно показывает это.

(Если вы хотите сэкономить время на написание кода, чтобы увидеть различия самостоятельно:))

http://www.codeproject.com/Tips/659066/ListBox-and-Panels-in-WPF

person Noctis    schedule 27.09.2013