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

DotNet MAUI中替代XCT TouchEffect长按功能的实现方案问询

.NET MAUI长按功能替代方案

1. 直接使用MAUI内置的LongPressGestureRecognizer

这是最简便的跨平台方案,无需额外依赖,直接绑定命令即可:

<Image>
    <Image.GestureRecognizers>
        <LongPressGestureRecognizer 
            Command="{Binding YourLongPressCommand}"
            CommandParameter="{Binding .}" /> <!-- 可选:传递参数 -->
    </Image.GestureRecognizers>
</Image>

代码中添加的方式:

var longPress = new LongPressGestureRecognizer();
longPress.Command = new Command(() => { /* 长按逻辑 */ });
yourImage.GestureRecognizers.Add(longPress);

2. 使用EventToCommandBehavior绑定原生事件

若坚持使用该行为,需针对不同平台绑定对应原生事件:

  • Android:绑定控件的LongClick事件
  • iOS:需先开启UserInteractionEnabled=true,再绑定LongPress手势相关事件

不过更推荐直接用MAUI内置手势识别器,避免跨平台事件适配的繁琐。

3. 扩展ImageHandler实现自定义长按命令

通过扩展ImageHandler的属性映射和原生事件绑定,实现自定义长按命令属性:

步骤1:定义附加属性

public static class LongPressExtensions
{
    public static readonly BindableProperty LongPressCommandProperty =
        BindableProperty.CreateAttached(
            "LongPressCommand", 
            typeof(ICommand), 
            typeof(LongPressExtensions), 
            null);

    public static ICommand GetLongPressCommand(BindableObject view)
    {
        return (ICommand)view.GetValue(LongPressCommandProperty);
    }

    public static void SetLongPressCommand(BindableObject view, ICommand value)
    {
        view.SetValue(LongPressCommandProperty, value);
    }
}

步骤2:扩展平台Handler

Android平台:
public class CustomImageHandler : ImageHandler
{
    protected override void ConnectHandler(Android.Widget.ImageView platformView)
    {
        base.ConnectHandler(platformView);
        platformView.LongClick += OnLongClick;
    }

    protected override void DisconnectHandler(Android.Widget.ImageView platformView)
    {
        platformView.LongClick -= OnLongClick;
        base.DisconnectHandler(platformView);
    }

    private void OnLongClick(object sender, Android.Views.View.LongClickEventArgs e)
    {
        var command = LongPressExtensions.GetLongPressCommand(VirtualView);
        command?.Execute(null);
    }
}
iOS平台:
public class CustomImageHandler : ImageHandler
{
    private UILongPressGestureRecognizer _longPressGesture;

    protected override void ConnectHandler(UIImageView platformView)
    {
        base.ConnectHandler(platformView);
        platformView.UserInteractionEnabled = true; // iOS ImageView默认禁用交互
        _longPressGesture = new UILongPressGestureRecognizer(OnLongPress);
        platformView.AddGestureRecognizer(_longPressGesture);
    }

    protected override void DisconnectHandler(UIImageView platformView)
    {
        platformView.RemoveGestureRecognizer(_longPressGesture);
        _longPressGesture.Dispose();
        _longPressGesture = null;
        base.DisconnectHandler(platformView);
    }

    private void OnLongPress(UILongPressGestureRecognizer gesture)
    {
        // 仅在手势开始时触发一次
        if (gesture.State == UIGestureRecognizerState.Began)
        {
            var command = LongPressExtensions.GetLongPressCommand(VirtualView);
            command?.Execute(null);
        }
    }
}

步骤3:注册Handler

在MauiProgram.cs中注册自定义Handler:

builder.ConfigureMauiHandlers(handlers =>
{
#if ANDROID
    handlers.AddHandler(typeof(Image), typeof(CustomImageHandler));
#elif IOS
    handlers.AddHandler(typeof(Image), typeof(CustomImageHandler));
#endif
});

步骤4:XAML中使用

<Image local:LongPressExtensions.LongPressCommand="{Binding YourLongPressCommand}" />

4. 其他可行思路

  • 自定义TouchEffect:参考Xamarin Community Toolkit中TouchEffect的实现,自行编写跨平台触摸效果,包含长按检测逻辑
  • 尝试MAUI Community Toolkit预览版:若项目允许使用预发布版本,可关注其TouchEffect的开发进度,预览版中可能已包含该功能

内容的提问来源于stack exchange,提问作者Simon Mardiné

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:13:23