У меня есть платформа Drag-Drop, в которой поддержка прокрутки уже есть (Pixel by Pixel scrolling). Это хорошо работает в случае, если виртуализация не включена, но если она включена, то она испортится.
Поскольку логика прокрутки основана на высоте Viewport и в соответствии с MSDN мы -
MSDN - Если CanContentScroll имеет значение true, значения свойств ExtentHeight, ScrollableHeight, ViewportHeight и VerticalOffset являются числом элементов. Если CanContentScroll имеет значение false, значения этих свойств являются независимыми от устройства пикселями. Кроме того, если виртуализация включена, тогда ExtentHeight представляет - общее количество элементов в ScrollViewer, а высота области просмотра - количество видимых элементов.
Так что прокрутка работает, я хочу что-то вроде ...
ScrollToContent(ScrollViewer, CurrentMousePositionWRTScrollViewer)
{
if(ScrollViewer's Viewport Height is in terms of Pixel)
{
----------Do Pixel by Pixel Scrolling --------
}
else if(ScrollViewer's Viewport Height represents number of items visible)
{
--------- Do Item by Item Scrolling ---------
}
Я попытался поставить галочку "CanContentScroll = false", проверяя, включена ли виртуализация или нет, но даже эта функция работает, потому что я обнаружил, что в одной из них, даже если CanContentScroll имеет значение true, высота окна просмотра в окне представляет количество видимых элементов, но оно равно фактическому рост. Однако в другом списке он показывает количество видимых элементов.
Актуальный код прокрутки -
private void ScrollToContent(ScrollViewer scrollViewer, Point point)
{
double verticalScrollOffset = 0.0;
double scrollDifference = 30.0;
double scrollDefaultOffset = 40.0;
if (scrollViewer == null) return;
if (scrollViewer.ViewportHeight != scrollViewer.ExtentHeight)
{
if (scrollViewer.ViewportHeight - point.Y < scrollDifference)
{
// See if we need to scroll down
verticalScrollOffset = scrollDefaultOffset;
}
else if (point.Y < scrollDifference)
{
// See if we need to scroll up
verticalScrollOffset = -scrollDefaultOffset;
}
// Scroll up or down
if (verticalScrollOffset != 0.0)
{
verticalScrollOffset += scrollViewer.VerticalOffset;
if (verticalScrollOffset < 0.0)
{
verticalScrollOffset = 0.0;
}
else if (verticalScrollOffset > scrollViewer.ScrollableHeight)
{
verticalScrollOffset = scrollViewer.ScrollableHeight;
}
scrollViewer.ScrollToVerticalOffset(verticalScrollOffset);
}
}
}
У меня была иллюзия, что виртуализация является виновником, но после проверки свойства IsVirtualization я заметил, что виртуализация здесь не проблема (это верно для обоих списков). Любая идея, что может быть возможным случаем ??
Проблема в том, что у меня есть 2 списка (почти одинаковые). В одном случае я получаю
Высота ViewPort == Количество видимых элементов
Однако в другом случае
Высота ViewPort = Фактическая высота ..
В чем может быть причина ??