none
ListBox item的自动滚动 RRS feed

  • 问题

  • 请问怎么实现listbox的items自动循环展示 每次展示下一项 鼠标移到上面又能停止 移动到items的最后一项后继续重新开始循环第一项

    2012年3月2日 2:05

答案

  • 你可以通过调用ListBox内部的ScrollViewer 的 ScrollToVerticalOffset / ScrollToEnd / ScrollToHome 等方法控制滚动,还有 PageUp / PageDown控制翻页,LineUp / LineDown控制上下行滚动。

    然后你只需要判断滚动条是否见底或者用户鼠标是否进入ListBox,做相应动作。

        private void listbox_Loaded(object sender, RoutedEventArgs e)
        {
          ListBox list = sender as ListBox;
          ScrollViewer scrollviewer = GetVisualChild<ScrollViewer>(list);
          Thread t = new Thread(() =>
          {
            while (true)
            {
              if (!list.IsMouseOver)
              {
                if (scrollviewer.VerticalOffset < scrollviewer.ScrollableHeight)
                  scrollviewer.Dispatcher.Invoke(new Action(() => { scrollviewer.LineDown(); }));
                else
                  scrollviewer.Dispatcher.Invoke(new Action(() => { scrollviewer.ScrollToHome(); }));
                Thread.Sleep(500);
              }
            }
          });
          t.Start();
        }
    
        public T GetVisualChild<T>(Visual parent) where T : Visual
        {
          T child = default(T);
          int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
          for (int i = 0; i < numVisuals; i++)
          {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
              child = GetVisualChild<T>(v);
            if (child != null)
              break;
          }
          return child;
        }

    例子:


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

    • 已标记为答案 huanghy 2012年3月5日 3:34
    2012年3月2日 8:19
    版主
  • ?????

    • 已标记为答案 huanghy 2012年3月5日 3:34
    • 已编辑 Shi Xin 2015年7月27日 7:52
    2012年3月5日 3:07
  • LineDown or LineLeft 的默认值是1行,如shixin所说,你可以ScrollToVerticalOffset等函数精确设置滚动偏移量。

    因为我们要直接通过调用函数去达到滚动效果,所以附加缓动函数变得不可能了. 


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

    • 已标记为答案 huanghy 2012年3月5日 3:35
    2012年3月5日 3:19
    版主

全部回复

  • 你可以通过调用ListBox内部的ScrollViewer 的 ScrollToVerticalOffset / ScrollToEnd / ScrollToHome 等方法控制滚动,还有 PageUp / PageDown控制翻页,LineUp / LineDown控制上下行滚动。

    然后你只需要判断滚动条是否见底或者用户鼠标是否进入ListBox,做相应动作。

        private void listbox_Loaded(object sender, RoutedEventArgs e)
        {
          ListBox list = sender as ListBox;
          ScrollViewer scrollviewer = GetVisualChild<ScrollViewer>(list);
          Thread t = new Thread(() =>
          {
            while (true)
            {
              if (!list.IsMouseOver)
              {
                if (scrollviewer.VerticalOffset < scrollviewer.ScrollableHeight)
                  scrollviewer.Dispatcher.Invoke(new Action(() => { scrollviewer.LineDown(); }));
                else
                  scrollviewer.Dispatcher.Invoke(new Action(() => { scrollviewer.ScrollToHome(); }));
                Thread.Sleep(500);
              }
            }
          });
          t.Start();
        }
    
        public T GetVisualChild<T>(Visual parent) where T : Visual
        {
          T child = default(T);
          int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
          for (int i = 0; i < numVisuals; i++)
          {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
              child = GetVisualChild<T>(v);
            if (child != null)
              break;
          }
          return child;
        }

    例子:


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

    • 已标记为答案 huanghy 2012年3月5日 3:34
    2012年3月2日 8:19
    版主
  • 谢谢

    再请教下,当我横向展示数据的时候,发现调用scrollviewer.LineDown() 没有效果后

    调用了scrollviewer.LineLeft();  但是需要内容向左滚动预设的量,这个量是哪个属性

    还有能不能在 LineDown()的时候 有一个缓慢滑动的效果

    直接LineDown()好像有点一卡一卡的 如果这样很复杂就算了 不好意思一直麻烦你 每次有问题都是你帮忙解决的,谢谢了

    2012年3月5日 2:20
  • ?????

    • 已标记为答案 huanghy 2012年3月5日 3:34
    • 已编辑 Shi Xin 2015年7月27日 7:52
    2012年3月5日 3:07
  • LineDown or LineLeft 的默认值是1行,如shixin所说,你可以ScrollToVerticalOffset等函数精确设置滚动偏移量。

    因为我们要直接通过调用函数去达到滚动效果,所以附加缓动函数变得不可能了. 


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

    • 已标记为答案 huanghy 2012年3月5日 3:35
    2012年3月5日 3:19
    版主
  • 多谢两位的帮助.....

    2012年3月5日 3:34