为了以这种方式扩展 ScrollView,我们应该实现 3 个构造函数
public UsefulScrollView(Context context)
public UsefulScrollView(Context context, IAttributeSet attrs)
public UsefulScrollView(Context context, IAttributeSet attrs, int defStyle)
我们还需要重写 OnDraw 方法
protected override void OnDraw(Android.Graphics.Canvas canvas)
为了实现我们可以在用户滚动时响应的事件功能,我们需要重写 OnScrollChanged 方法。
protected override void OnScrollChanged(int l, int t, int oldl, int oldt)
允许事件侦听和处理有多种方法,但为了与 Xamarin 保持一致,我们可以向我们的类添加公共 EventHandler 属性。
public EventHandler<T> ScrollEventHandler { get; set; }
我们希望将 OnScrollChanged 中的值传递给 EventHandler,所以让我们扩展 EventArgs
public class UsefulScrollEventArgs : EventArgs{
public int l { get; set; }
public int t { get; set; }
public int oldl { get; set; }
public int oldt { get; set; }
}
最后,不要忘记在每个构造函数中初始化我们的处理程序
ScrollEventHandler = (object sender, UsefulScrollEventArgs e) => {};
把它们放在一起,它可能看起来像这样
扩展的 EventArgs 类
public class UsefulScrollEventArgs : EventArgs{
public int l { get; set; }
public int t { get; set; }
public int oldl { get; set; }
public int oldt { get; set; }
}
扩展的 ScrollView 类
public class UsefulScrollView : ScrollView
{
public EventHandler<UsefulScrollEventArgs> ScrollEventHandler { get; set; }
public UsefulScrollView (Context context)
: base(context)
{
ScrollEventHandler = (object sender, UsefulScrollEventArgs e) => {};
}
public UsefulScrollView (Context context, IAttributeSet attrs)
: base(context, attrs) {
ScrollEventHandler = (object sender, UsefulScrollEventArgs e) => {};
}
public UsefulScrollView(Context context, IAttributeSet attrs, int defStyle)
: base(context, attrs, defStyle) {
ScrollEventHandler = (object sender, UsefulScrollEventArgs e) => {};
}
protected override void OnScrollChanged(int l, int t, int oldl, int oldt)
{
ScrollEventHandler (this,
new UsefulScrollEventArgs ()
{l=l,t=t,oldl=oldl,oldt=oldt});
base.OnScrollChanged (l, t, oldl, oldt);
}
protected override void OnDraw(Android.Graphics.Canvas canvas)
{
}
}
这个问答有助于解决这个问题:Scrollview listener is not working in Xamarin for Android?