You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Mac Catalyst平台的MAUI ScrollView中检测滚动结束

MAUI ScrollView 监听滚动结束事件实现方案

1. 创建自定义ScrollView子类

先定义带ScrollEnded事件的自定义ScrollView,统一跨平台的事件触发逻辑:

public class CustomScrollView : ScrollView
{
    public event EventHandler ScrollEnded;

    // 供平台Handler调用,触发结束事件
    internal void OnScrollEnded()
    {
        ScrollEnded?.Invoke(this, EventArgs.Empty);
    }
}

2. 实现Android平台Handler

在Platforms/Android目录下创建自定义Handler,对接Android原生滚动状态变化事件:

using Android.Views;
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Controls.Platform;

namespace YourAppNamespace.Platforms.Android
{
    public class CustomScrollViewHandler : ScrollViewHandler
    {
        protected override void ConnectHandler(ViewGroup platformView)
        {
            base.ConnectHandler(platformView);
            if (platformView is MauiScrollView mauiScrollView)
            {
                mauiScrollView.ScrollStateChanged += OnScrollStateChanged;
            }
        }

        protected override void DisconnectHandler(ViewGroup platformView)
        {
            if (platformView is MauiScrollView mauiScrollView)
            {
                mauiScrollView.ScrollStateChanged -= OnScrollStateChanged;
            }
            base.DisconnectHandler(platformView);
        }

        private void OnScrollStateChanged(object sender, ScrollStateChangedEventArgs e)
        {
            // 滚动状态变为Idle时,判定为滚动结束
            if (e.ScrollState == ScrollState.Idle)
            {
                (VirtualView as CustomScrollView)?.OnScrollEnded();
            }
        }
    }
}

3. 实现iOS平台Handler

在Platforms/iOS目录下创建自定义Handler,通过UIScrollView的滚动事件判断结束状态:

using Microsoft.Maui.Handlers;
using UIKit;

namespace YourAppNamespace.Platforms.iOS
{
    public class CustomScrollViewHandler : ScrollViewHandler
    {
        protected override void ConnectHandler(UIScrollView platformView)
        {
            base.ConnectHandler(platformView);
            platformView.Scrolled += OnScrolled;
        }

        protected override void DisconnectHandler(UIScrollView platformView)
        {
            platformView.Scrolled -= OnScrolled;
            base.DisconnectHandler(platformView);
        }

        private void OnScrolled(object sender, EventArgs e)
        {
            var scrollView = sender as UIScrollView;
            // 拖拽停止且减速完成,判定为滚动结束
            if (!scrollView.IsDragging && !scrollView.IsDecelerating)
            {
                (VirtualView as CustomScrollView)?.OnScrollEnded();
            }
        }
    }
}

4. 注册自定义Handler

在MauiProgram.cs中配置Handler与自定义控件的映射:

builder.ConfigureMauiHandlers(handlers =>
{
#if ANDROID
    handlers.AddHandler(typeof(CustomScrollView), typeof(Platforms.Android.CustomScrollViewHandler));
#elif IOS
    handlers.AddHandler(typeof(CustomScrollView), typeof(Platforms.iOS.CustomScrollViewHandler));
#endif
});

5. 在XAML和代码中使用

在XAML中引用自定义ScrollView并绑定ScrollEnded事件:

<!-- 替换local为你的自定义控件命名空间 -->
<local:CustomScrollView ScrollEnded="CustomScrollView_ScrollEnded">
    <!-- 你的滚动内容,比如VerticalStackLayout等 -->
</local:CustomScrollView>

在后台代码中实现事件逻辑:

private void CustomScrollView_ScrollEnded(object sender, EventArgs e)
{
    // 编写滚动结束后的业务逻辑
    Console.WriteLine("滚动操作已完成");
}

内容的提问来源于stack exchange,提问作者Ashok Kuvaraja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:15:14