none
ListView拖动Item的问题 RRS feed

  • 问题

  • 在拖动操作的时候,如果列表项很多出现了滚动条,那么就需要在鼠标移动到上部或是下部时进行必要的滚动。
    这个在ListView中有什么好的方法么?


    还有一个小问题,就是如何判断ListView当前是否已经出现了滚动条?


    Keep Moving.

    2012年2月10日 6:50

答案

  • 还有一个小问题,就是如何判断ListView当前是否已经出现了滚动条?

    通过可视树遍历,找到两个滚动条,分别看他们的Visibility属性。这个问题以前有过:http://stackoverflow.com/questions/792624/testing-the-scrollbar-visibility-of-a-listbox-in-code-behind 里面的FindVisualChild方法是这个:

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


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Mr.Brandy 2012年2月10日 10:02
    2012年2月10日 8:03
    版主
  • ?????

    • 已标记为答案 Mr.Brandy 2012年2月15日 2:52
    • 已编辑 Shi Xin 2015年7月27日 7:55
    2012年2月10日 14:28

全部回复

  • 这个问题是在09年的一位前辈提出的,没有具体的解决方案,现在小生也遇到此问题,希望谁知道的能够帮助我

    Keep Moving.

    2012年2月10日 6:51
  • 以前我在英文论坛解决过,你看下这个帖子:http://social.msdn.microsoft.com/Forums/en/wpf/thread/470638b7-1edf-48e2-8c2c-666380f58069

    在DragOver里面判断鼠标当前位置是否靠近顶部或者底部,然后遍历可视树找到ScrollViewer, 让滚动条相应滚动。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年2月10日 7:57
    版主
  • 还有一个小问题,就是如何判断ListView当前是否已经出现了滚动条?

    通过可视树遍历,找到两个滚动条,分别看他们的Visibility属性。这个问题以前有过:http://stackoverflow.com/questions/792624/testing-the-scrollbar-visibility-of-a-listbox-in-code-behind 里面的FindVisualChild方法是这个:

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


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Mr.Brandy 2012年2月10日 10:02
    2012年2月10日 8:03
    版主
  • 谢谢Bao哥了哈,我研究下

    Keep Moving.

    2012年2月10日 10:03
  • ?????

    • 已标记为答案 Mr.Brandy 2012年2月15日 2:52
    • 已编辑 Shi Xin 2015年7月27日 7:55
    2012年2月10日 14:28
  • 谢谢shixin哥的帮助,我也是大概这么做的。只是不是用的WPF的拖动,用的传统的拖动,监听point,在顶部护着底部的时候,给出一个目标范围,当point在范围内的时候,让滚动条滚动

    SV.ScrollToHorizontalOffset(SV.HorizontalOffset + 1 + P0.X - P2.X);

    不过shixin哥的做法,感觉有点太高端了,最终的处理都是上面这样,但是过程有点看不懂


    Keep Moving.

    2012年2月15日 2:56