2009-08-12 7 views
10

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

WPF Noobie, Джим

Вот 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> 

ответ

23

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

+0

Когда я помещал Listbox в Grid, а не StackPanel, проблема исчезла. Я это ошибка кода WPF, ошибка дизайна WPF или преднамеренное поведение WPF? –

+0

Я думаю, что это просто способ работы StackPanel. В вашем случае StackPanel был таким же высоким, как ListBox, который должен был быть без прокрутки, затем StackPanel получил «обрезанный» внизу. –

+0

Да, проблема с StackPanel, и проблема решена Grid. Спасибо @JohnMyczek –

2

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

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

+0

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

0

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

2

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

  1. Set ScrollViewer.VerticalScrollBarVisibility = «Auto»
  2. Установки высоты свойства ListBox на некоторую высоту, что вы ожидаете видеть.

Это должно привести к появлению полосы прокрутки.

1

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

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

0

Другое решение с модификацией Dave's - использовать только ScrollViewer. Вы можете прокручивать, поместив мышь в ScrollBar ScrollView. Я использую его так, потому что мне не нравится, как ListBox перескакивает с элемента на элемент, а иногда и отсутствующие элементы из Top. Немного тяжело на глаза тоже. Мне нравится гладкая прокрутка ScrollViewer.

+0

Просто прочитайте это сообщение, чтобы добавить прокрутку, когда мышь находится над ListBox. http://stackoverflow.com/questions/2976240/how-can-make-scrollviewer-scroll-when-mouse-is-over-any-content?rq=1 – VcDeveloper

0

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

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

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

4

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

<ListBox Height="200" 
     Name="NoteList" 
     ScrollViewer.CanContentScroll="True" 
     ScrollViewer.VerticalScrollBarVisibility="Visible"> 
</ListBox> 
Смежные вопросы