2015-03-06 4 views
2

У меня есть ListBox, проблема, с которой я сталкиваюсь, пытается получить действительные значения из объекта IScrollInfo.Получение действительных значений из ScrollInfo в ListBox

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

я получаю следующие значения из:
_scrollInfo.ExtentHeight = 13
_scrollInfo.ViewportHeight = 7
_scrollInfo.VerticalOffset = varying but 1-6

значения от:
UIElement scrollable = _scrollInfo as UIElement;
себе чтобы они были правильными.
scrollable.RenderSize.Height = 146, что примерно верно.

Что мне интересно, о том:

Когда мой контроль ListBox сначала загружается он привязан к пустой ObservableCollection. Только после этого элементы будут добавлены. Может ли быть, что объект IScrollInfo сохраняет эти начальные значения, когда ListBox был пуст?

Другое дело, что объект IScrollInfo является VirtualizingStackPanel, может ли это иметь какое-либо отношение к этому вопросу?

[EDIT]
попытался изменить VirtualizingStackPanel к StackPanel, однако я по-прежнему получать те же результаты.

+0

'VirtualizingStackPanel' обычно является хорошим преступником. Это должно быть просто проверить, просто сделав его другим контейнером. В чем именно вы пытаетесь использовать эту информацию? – Taekahn

+0

Я загружаю свой ObservableCollection с помощью CheckedListItem, который удерживает ли объект DataGridColumn видимым или нет. С помощью операций перетаскивания столбцов также можно переупорядочить. Я также добавил возможность автоматического прокрутки ListBox при перетаскивании.Это автоматический прокрутки, который использует эту информацию. – Hank

+0

Когда вы говорите «просто создав другой контейнер», вы имеете в виду, создав новый шаблон управления для ListBox? – Hank

ответ

3

Данное поведение задается как ScrollViewer.CanContentScroll="True" В основном это говорит о том, что вам не разрешено прокручивать по пикселям, а только по элементам.

Рассмотрим следующий пример:

private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) 
{ 
    var scrollViewer = (ScrollViewer) sender; 
    Trace.WriteLine(string.Format("ExtentHeight: {0}, ViewportHeight : {1}, VerticalOffset : {2}", 
     scrollViewer.ExtentHeight, scrollViewer.ViewportHeight, scrollViewer.VerticalOffset)); 
} 


<ScrollViewer Height="150" ScrollChanged="ScrollViewer_ScrollChanged" CanContentScroll="True"> 
    <VirtualizingStackPanel> 
     <Rectangle Height="40" Margin="5" Fill="Red" /> 
     <Rectangle Height="40" Margin="5" Fill="Green" /> 
     <Rectangle Height="40" Margin="5" Fill="Blue" /> 
     <Rectangle Height="40" Margin="5" Fill="Red" /> 
     <Rectangle Height="40" Margin="5" Fill="Green" /> 
     <Rectangle Height="40" Margin="5" Fill="Blue" /> 
     <Rectangle Height="40" Margin="5" Fill="Red" /> 
    </VirtualizingStackPanel> 
</ScrollViewer> 

вы получите следующий результат:

ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 0 
ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 1 
ExtentHeight: 7, ViewportHeight : 3, VerticalOffset : 2 

, но при установке CanContentScroll="False":

ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 3,01724137931035 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 6,03448275862069 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 9,05172413793104 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 12,0689655172414 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 15,0862068965517 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 18,1034482758621 
ExtentHeight: 350, ViewportHeight : 150, VerticalOffset : 21,1206896551724 

В первом примере вы скроллинг по пунктам. У вас есть семь пунктов, так ExtentHeight 7 и 3 элементов являются видимыми, так ViewportHeight равно 3.

Во втором примере вы прокрутка пикселей, поэтому ExtentHeight является общей высотой всех элементов и высота окна просмотра высоты scrollviewver

Мораль истории состоит в том, что в некоторых сценариях вы не хотите измерять размер всех предметов, потому что это может иметь отрицательный эффект. Это особенно важно при виртуализации элементов.

+0

Не могли бы попросить лучшего объяснения! Спасибо. – Hank

Смежные вопросы