合并滚动 - “逐像素”+“逐项”

2023-12-06

我有一个拖放框架,其中已经存在滚动支持(逐像素滚动)。在未启用虚拟化的情况下,这很有效,但如果启用了虚拟化,那么它就会变得混乱。
由于滚动的逻辑基于视口高度,并且根据 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 个列表框(几乎相似) 在一种情况下我得到视口高度 == 可见项目数然而在其他情况下视口高度 = 实际高度 ..

可能的原因是什么?


bool isVirtualizing = (bool)scrollViewer.GetValue(VirtualizingStackPanel.IsVirtualizingProperty);
VirtualizationMode mode = (VirtualizationMode)scrollViewer.GetValue(VirtualizingStackPanel.VirtualizationModeProperty);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并滚动 - “逐像素”+“逐项” 的相关文章

随机推荐