Wpf自动滚动效果

一、思路

1.使用ScrollView的Scroll.ScrollToVerticalOffset(offset)方法进行滚动

2.ScrollView中放置2个ListView,第一个滚动出边界后,移除,然后再动态添加一个内容相同的ListView

3.ListView设置最小高度,以保证在内容不多时同一条内容出现2次

4.每当ListView滚动出边界后,offset置0,放置offset无限增大,导致崩溃,同时方便计算ListView何时滚动出边界

二、实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        double offset = 0.0;
        
        public MainWindow()
        {
            InitializeComponent();
            //设置定时器     


            ContentPanel.Children.Add(new MyListView());
            ContentPanel.Children.Add(new MyListView());

            for (int i = 0; i < 5; i++)
            {
                CreateInt(i);             
            }

            timer = new DispatcherTimer();
            timer.Interval = new TimeSpan(1000);   //时间间隔为一秒
            timer.Tick += new EventHandler(timer_Tick);      
            timer.Start();            
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            CreateRandom();
        }

        private void CreateRandom()
        {
            Random random = new Random();
            AddItem(random.Next().ToString());
        }

        private void CreateInt(int i)
        {
            AddItem(i.ToString());
        }

        private void AddItem(string content)
        {
            foreach (var lst in ContentPanel.Children)
            {
                if (lst is MyListView)
                {
                    (lst as MyListView).Items.Add(content);
                }
            }
        }

        private DispatcherTimer timer;

        private void timer_Tick(object sender, EventArgs e)
        {
            offset += 0.01;
            Scroll.ScrollToVerticalOffset(offset);
            if (offset >= (ContentPanel.Children[0] as MyListView).ActualHeight)
            {
                Console.WriteLine("添加新list");
                MyListView myListView = new MyListView();
                foreach (var item in (ContentPanel.Children[0] as MyListView).Items)
                {
                    myListView.Items.Add(item);
                }
                ContentPanel.Children.RemoveAt(0);
                ContentPanel.Children.Add(myListView);
                offset = 0.0;
            }
        }
    }
}

三、其他

MyListView只是一个设置了固定高度的ListView

原文地址:https://www.cnblogs.com/punkrocker/p/11261295.html