合并滚动 - “像素像素” +“项目项目” [英] Consolidated Scrolling - "Pixel by Pixel" + "Item by Item"

查看:149
本文介绍了合并滚动 - “像素像素” +“项目项目”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个拖放框架,其中滚动支持已经存在(Pixel by Pixel scrolling)。这是很好的,如果虚拟化没有启用,但是如果它被启用,那么它会被搞砸。

由于滚动的逻辑是基于Viewport高度,根据MSDN我们有 -


MSDN-如果CanContentScroll为true,则ExtentHeight,ScrollableHeight,ViewportHeight和VerticalOffset属性的值为项目数。如果CanContentScroll为false,这些属性的值为设备独立像素。另外如果启用虚拟化,那么ExtentHeight表示 - ScrollViewer和Viewport Height中的项目的总数表示当前可见的项目数。


所以滚动dint工作我想要的东西 -

  ScrollToContent(ScrollViewer,CurrentMousePositionWRTScrollViewer)
{
if(ScrollViewer的Viewport高度以像素为单位)
{
---------- Pixel by Pixel Scrolling --------
}
else if (ScrollViewer的视口高度表示可见的项目数量)
{
---------按项目滚动进行项目滚动---------
} $ b $我尝试放置CanContentScroll = false的检查,检查虚拟化是否启用,但即使是这样,因为我工作,因为我发现在一个即使CanContentScroll是真的Viewport高度dint表示可见的项目的数量,但它等于实际的高度。但是在另一个列表框中,它显示的项目数量可见。



实际的滚动代码 -

  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)
{
//查看是否我们需要向下滚动
verticalScrollOffset = scrollDefaultOffset;
}
else if(point.Y< scrollDifference)
{
//查看是否需要向上滚动
verticalScrollOffset = -scrollDefaultOffset;
}
//向上或向下滚动
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 Height ==可见的项目数量
但在其他情况下
ViewPort Height =实际高度 ..



可能的原因是什么?

解决方案

回答实际高度与视口高度和滚动问题



代码:在启用虚拟化的情况下,我使用选定的项目来执行项目滚动。

  //管理垂直滚动。 
if(scrollViewer.ViewportHeight!= scrollViewer.ExtentHeight)
{
//注意:MSDN-如果CanContentScroll为true,则ExtentHeight,ScrollableHeight,ViewportHeight和VerticalOffset $ b $的值b //属性是项数。如果CanContentScroll为false,这些属性的值为设备独立像素。
//如果启用虚拟化,则ExtentHeight表示 - ScrollViewer和Viewport Height中的项目总数
//表示当前可见的项目数。
if(scrollViewer.CanContentScroll == false)
{
if(scrollViewer.ViewportHeight - point.Y< scrollDifference)
{
//看看我们是否需要向下滚动
verticalScrollOffset = scrollDefaultOffset;
}
else if(point.Y< scrollDifference)
{
//查看是否需要向上滚动
verticalScrollOffset = -scrollDefaultOffset;
}

//向上或向下滚动
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);
}
}
else
{
if(scrollViewer!= null)
{
//控制滚动速度 - 做项目按项目滚动现在,这将是相当快,所以添加时间差距。
if(DateTime.Now.Subtract(lastScrollTime).TotalMilliseconds> 200)
{
if(scrollViewer.ActualHeight - point.Y< scrollDifference)
{
//查看是否需要向下滚动
verticalScrollOffset = scrollDefaultOffset;
}
else if(point.Y< scrollDifference)
{
//查看是否需要向上滚动
verticalScrollOffset = -scrollDefaultOffset;
}

if(verticalScrollOffset!= 0.0)
{
//向上滚动内容
if(verticalScrollOffset< 0&&& VerticalOffset> 0)//还检查scrollviewer中是否有任何不可见的元素
{
scrollViewer.LineUp();
lastScrollTime = DateTime.Now;
}
else if(verticalScrollOffset> 0&&
scrollViewer.VerticalOffset< scrollViewer.ExtentHeight - scrollViewer.ViewportHeight)
{
scrollViewer.LineDown );
lastScrollTime = DateTime.Now;
}
}
}
}
}
}


I've a Drag-Drop framework in which scrolling support is already there (Pixel by Pixel scrolling). This works good in case Virtualization is not enabled but if it is enabled then it gets messed up.
As the logic of scrolling is based on Viewport height and as per MSDN we've -

MSDN- If CanContentScroll is true, the values of the ExtentHeight, ScrollableHeight, ViewportHeight, and VerticalOffset properties are number of items. If CanContentScroll is false, the values of these properties are Device Independent Pixels. Also If Virtualization is Enabled then ExtentHeight Represents - TotalNumber of Items in ScrollViewer and Viewport Height Represents Count of Items currently visible.

So scrolling dint work i want something like--

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 ---------
}

I tried putting check of "CanContentScroll = false", checking Virtualization is enabled or not but even that dint work because i found that in one even if CanContentScroll is true Viewport height dint represent the number of items visible but it's equal to actual height. However on another listbox it shows - the number of items visible.

Actual Code of scrolling -

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);
                }
        }
    }

I was in illusion that virtualization is culprit but after checking IsVirtualization property, I noticed that virtualization is not an issue here (its true for both listboxes) .. Any Idea what can be the possible case ??
Issue is - I've 2 listboxes (almost similar) In one case i get ViewPort Height == Number of Items visible However in other case ViewPort Height = Actual Height ..

What can be the possible reason ??

解决方案

Answer Actual Height Vs Viewport Height and Scrolling Issue

Code : I used selected Item to perfrom Item by Item scrolling in case of Virtualization enabled

 // Manage vertical scrolling. 
        if (scrollViewer.ViewportHeight != scrollViewer.ExtentHeight)
        {
            // NOTE :MSDN- If CanContentScroll is true, the values of the ExtentHeight, ScrollableHeight, ViewportHeight, and VerticalOffset
            // properties are number of items. If CanContentScroll is false, the values of these properties are Device Independent Pixels.
            // Also If Virtualization is Enabled then ExtentHeight Represents - TotalNumber of Items in ScrollViewer and Viewport Height
            // Represents Count of Items currently visible.
            if (scrollViewer.CanContentScroll == false)
            {
                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);
                }
            }
            else
            {
                if (scrollViewer != null)
                {
                    // To ControlScrolling Speed - as we're doing Item By Item Scrolling now, it would be quite fast so add a time gap.
                    if (DateTime.Now.Subtract(lastScrollTime).TotalMilliseconds > 200)
                    {
                        if (scrollViewer.ActualHeight - 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;
                        }

                        if (verticalScrollOffset != 0.0)
                        {
                            // Scroll Content upwards 
                            if (verticalScrollOffset < 0 && scrollViewer.VerticalOffset > 0) // Also check if there are any non visible elements in scrollviewer
                            {
                                scrollViewer.LineUp();
                                lastScrollTime = DateTime.Now;
                            }
                            else if (verticalScrollOffset > 0 &&
                                scrollViewer.VerticalOffset < scrollViewer.ExtentHeight - scrollViewer.ViewportHeight)
                            {
                                scrollViewer.LineDown();
                                lastScrollTime = DateTime.Now;
                            }
                        }
                    }
                }
            }
        }

这篇关于合并滚动 - “像素像素” +“项目项目”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆