zoukankan      html  css  js  c++  java
  • Silverlight一句话实现 ScrollViewer 滚动事件

    WPFScrollViewer 控件中有 ScrollChanged 事件,到了 Silverlight 就没有此事件了。经常会有需要使用此事件去驱动一些功能的实现,例如延迟加载。网上也流传了一种使用监听 VSM(Visual State Manager) 实现的方法(见这里),但是其方法有点过于复杂,并且效率低下。所以这里放出一种简单的实现 ScrollChanged 事件的方法。

    第一步:当然是找到你所需要增加此功能的页面的后台代码;

    第二步:在为其增加一个事件

    public event EventHandler VerticalScrollChanged;

    第三步:在此页面的构造函数中增加

    复制代码
    this.SetBinding(//绑定
    DependencyProperty.RegisterAttached("VerticalOffset",//注册一个附加属性
    typeof(double),//这个属性的类型是 double
    this.GetType(),//需要注册到自己
    new PropertyMetadata((d, e) =>//元数据,注册变化时的事件
    {
    if (VerticalScrollChanged != null)//如果有注册,则驱动它
    VerticalScrollChanged(this, EventArgs.Empty);
    })),
    new Binding("VerticalOffset") { Source = this.scrollViewer });//绑定的源和路径
    复制代码

    第四步:你就可以随意的在某处注册 VerticalScrollChanged 事件了。

    注意一点,这里假设你所需要监听的 ScrollViewer 已经命名为 “scrollViewer ”,并且只需要监听垂直方向的滚动。

    如果你感兴趣,还可以将此方法封装成一个新控件,直接调用。或者你可以将 WPF 中此事件完整的实现:ScrollChangedEventArgs

    好了,下面的代码演示如何在即将滚动到底部的时候再次加载数据:

    复制代码
    public partial class MainPage : PhoneApplicationPage
    {
    // Constructor
    public MainPage()
    {
    InitializeComponent();

    this.SetBinding(
    DependencyProperty.RegisterAttached("VerticalOffset",
    typeof(double),
    this.GetType(),
    new PropertyMetadata((d, e) =>
    {
    if (VerticalScrollChanged != null)
    VerticalScrollChanged(this, EventArgs.Empty);
    })),
    new Binding("VerticalOffset") { Source = this.scrollViewer });
    }

    public event EventHandler VerticalScrollChanged;

    private void button1_Click(object sender, RoutedEventArgs e)
    {
    Random rnd = new Random();
    for (int i = 0; i < 40; i++)
    {
    items.Items.Add(new MyClass { A = rnd.Next(), B = rnd.Next() });
    }
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
    scrollViewer.ScrollToVerticalOffset(0.0);
    items.Items.Clear();
    }

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
    this.VerticalScrollChanged += (ss, ee) =>
    {
    if (scrollViewer.ViewportHeight + scrollViewer.VerticalOffset > scrollViewer.ExtentHeight - scrollViewer.ViewportHeight * 3)
    {
    button1_Click(null, null);
    }
    };
    }
    public class MyClass
    {
    public int A { get; set; }
    public int B { get; set; }
    }
    }
    复制代码


    原址:http://www.cnblogs.com/lanmiao/articles/2385212.html


     
  • 相关阅读:
    How To Build CyanogenMod Android for smartphone
    CentOS安装Code::Blocks
    How to Dual boot Multiple ROMs on Your Android SmartPhone (Upto Five Roms)?
    Audacious——Linux音乐播放器
    How to Dual Boot Multiple ROMs on Your Android Phone
    Everything You Need to Know About Rooting Your Android Phone
    How to Flash a ROM to Your Android Phone
    什么是NANDroid,如何加载NANDroid备份?
    Have you considered compiled a batman-adv.ko for android?
    BATMAN—Better Approach To Mobile Adhoc Networking (B.A.T.M.A.N.)
  • 原文地址:https://www.cnblogs.com/zziss/p/2727382.html
Copyright © 2011-2022 走看看