2017-01-10 7 views
3

Как заставить панель прокрутки ListBox работать, когда один элемент больше размера списка.WPF Listbox не может отображать содержимое, если один элемент выходит за пределы высоты элемента управления.

У меня есть ListBox с пользовательским ItemTemplate. Шаблон показывает сообщение и метку времени для заметок. Проблема в том, что оператор создает очень длинную заметку, полоса прокрутки ListBox не появляется и не позволит вам прокручивать вверх и вниз, чтобы увидеть всю заметку. Управление отлично работает для нескольких небольших заметок. Если вы добавите небольшую заметку после большой заметки, появится полоса прокрутки, и вы можете прокручивать вниз, но вы не можете увидеть всю первую заметку, только ту часть, которая была видна до и после нее, при нажатии на следующую заметку при прокрутке.

<ListBox Grid.Row="1" ItemsSource="{Binding Notes}" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Border Margin="1" Padding="5" BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="3"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto" /> 
          </Grid.RowDefinitions> 

          <TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding CreatedDateTime, StringFormat={}{0:h:mm:ss tt}}" Margin="0,0,20,0"/> 
          <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding Note}" TextWrapping="Wrap" FontSize="20"/> 

         </Grid> 
        </Border> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Фотографии, которые помогут объяснить.

enter image description here enter image description here

+0

Итак, вы можете перейти к следующему элементу, но вы не можете прокручивать его в негабаритных деталях? –

+1

Вы также можете отключить вертикальный ScrollBar, а затем поместить весь ListBox в ScrollViewer. – Clemens

+0

(Ed Plunkett) Правильно. Я не могу прокручивать негабаритный элемент. (Клеменс 23). Это работает визуально. Однако я не могу прокручивать вверх/вниз с помощью колеса сенсорного экрана/мыши, если я не вишу над полосой прокрутки. Я думаю, что Listbox захватывает события прокрутки, а не распространяет их до контейнера ScrollViewer. –

ответ

1

Я попытался ScrollViewer, но в конечном итоге вызывает дополнительные проблемы. Мне пришлось запускать события прокрутки маршрута, а не события касания и т. Д.

В конце концов я нашел простое свойство для установки. В ListBox установите 'ScrollViewer.CanContentScroll = "False"'.

Это изменяет поведение прокрутки, и содержимое больше не отключается. Все события также работают.

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