none
控件使用DragDrop.DoDragDrop过程中,无法响应MouseWheel事件 RRS feed

  • 问题

  • 你好!我在使用ListBox控件时,对ListBox的某个item进行拖拽,同时希望通过鼠标滚轮对ListBox展示内容进行滚动,以方便把拖拽的item移动到指定位置。但遇到如题问题:

    2014年10月15日 3:13

答案

  • 你好 Kevin,

    >>控件使用DragDrop.DoDragDrop过程中,无法响应MouseWheel事件

    根据我的经验,当在拖拽过程中,是不可以响应MouseWheel事件的,但是我们可以实现当拖拽到可见区域最上方和最下方,ListBox可以自动滚动子项目,以方便我们移动到指定位置, 解决方案来自于:http://stackoverflow.com/questions/1316251/wpf-listbox-auto-scroll-while-dragging

    在DragOver事件中, 检测鼠标相对于ListBox的垂直位置,如果计算出来的结果是小于一定值,表示鼠标当前位于可见区域最上方,要向上滚动;如果相对位置接近可见区域高度,表示要向下滚动。

    滚动的话使用 ScrollViewer.ScrollToVerticalOffset 方法:http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.scrolltoverticaloffset(v=vs.110).aspx

    private void ItemsList_DragOver(object sender, System.Windows.DragEventArgs e)
    {
        ListBox li = sender as ListBox;
        ScrollViewer sv = FindVisualChild<ScrollViewer>(ItemsList);
    
        double tolerance = 10;
        double verticalPos = e.GetPosition(li).Y;
        double offset = 3;
    
        if (verticalPos < tolerance) // Top of visible list?
        {
            sv.ScrollToVerticalOffset(sv.VerticalOffset - offset); //Scroll up.
        }
        else if (verticalPos > li.ActualHeight - tolerance) //Bottom of visible list?
        {
            sv.ScrollToVerticalOffset(sv.VerticalOffset + offset); //Scroll down.    
        }
    }
    
    public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
    {
        // Search immediate children first (breadth-first)
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
    
            if (child != null && child is childItem)
                return (childItem)child;
    
            else
            {
                childItem childOfChild = FindVisualChild<childItem>(child);
    
                if (childOfChild != null)
                    return childOfChild;
            }
        }
    
        return null;
    }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月16日 3:29
    版主