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

Xamarin.Forms UWP端DoubleTapped事件未触发问题求助

UWP端双击事件不触发的解决方案

核心问题是Xamarin.Forms的TapGestureRecognizer会拦截UWP原生触摸事件,导致你注册的DoubleTapped事件被吞掉,只会触发单次Tapped。以下是具体解决步骤:


1. 移除Label上的TapGestureRecognizer

不要同时混用TapGestureRecognizer和平台原生的DoubleTapped事件,两者的事件处理逻辑会冲突。如果需要同时支持单击和双击,统一通过自定义平台效果来实现。

2. 修改UWP平台的DoubleClickEffect实现

在平台效果里同时处理原生的Tapped和DoubleTapped事件,通过定时器区分单击和双击:

using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;

[assembly: ResolutionGroupName("YourAppGroupName")]
[assembly: ExportEffect(typeof(YourAppNamespace.UWP.DoubleClickEffect), nameof(LongPressedDblClickEffect))]
namespace YourAppNamespace.UWP
{
    public class DoubleClickEffect : PlatformEffect
    {
        private DispatcherTimer _tapTimer;
        private TextBlock _uwpTextBlock;

        protected override void OnAttached()
        {
            _uwpTextBlock = Control as TextBlock;
            if (_uwpTextBlock == null) return;

            // 注册原生触摸事件
            _uwpTextBlock.DoubleTapped += OnDoubleTapped;
            _uwpTextBlock.Tapped += OnTapped;

            // 初始化双击判断定时器(300ms是通用的双击间隔阈值)
            _tapTimer = new DispatcherTimer
            {
                Interval = TimeSpan.FromMilliseconds(300)
            };
            _tapTimer.Tick += TapTimer_Tick;
        }

        private void TapTimer_Tick(object sender, object e)
        {
            _tapTimer.Stop();
            // 触发自定义单击事件
            var effect = Element.Effects.FirstOrDefault(e => e is LongPressedDblClickEffect) as LongPressedDblClickEffect;
            effect?.OnSingleTap();
        }

        private void OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
        {
            _tapTimer.Stop();
            // 触发自定义双击事件
            var effect = Element.Effects.FirstOrDefault(e => e is LongPressedDblClickEffect) as LongPressedDblClickEffect;
            effect?.OnDoubleTap();
            e.Handled = true; // 标记事件已处理,避免后续传播
        }

        private void OnTapped(object sender, TappedRoutedEventArgs e)
        {
            _tapTimer.Start();
        }

        protected override void OnDetached()
        {
            if (_uwpTextBlock == null) return;

            _uwpTextBlock.DoubleTapped -= OnDoubleTapped;
            _uwpTextBlock.Tapped -= OnTapped;

            _tapTimer?.Stop();
            _tapTimer = null;
            _uwpTextBlock = null;
        }
    }
}

3. 更新共享项目的LongPressedDblClickEffect类

添加单击和双击的事件定义,让XAML可以绑定:

using Xamarin.Forms;

namespace YourAppNamespace
{
    public class LongPressedDblClickEffect : RoutingEffect
    {
        public event EventHandler DoubleTap;
        public event EventHandler SingleTap;

        public LongPressedDblClickEffect() : base($"YourAppGroupName.{nameof(LongPressedDblClickEffect)}")
        {
        }

        internal void OnDoubleTap()
        {
            DoubleTap?.Invoke(this, EventArgs.Empty);
        }

        internal void OnSingleTap()
        {
            SingleTap?.Invoke(this, EventArgs.Empty);
        }
    }
}

4. 修改XAML代码

移除TapGestureRecognizer,直接绑定自定义效果的事件:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.MainPage">
    <StackLayout>
        <Label Text="测试双击/单击" FontSize="Large">
            <Label.Effects>
                <local:LongPressedDblClickEffect DoubleTap="DoubleClickEffect_DoubleTap" 
                                                 SingleTap="DoubleClickEffect_SingleTap"/>
            </Label.Effects>
        </Label>
    </StackLayout>
</ContentPage>

5. 后台代码处理事件

在页面的代码-behind里实现事件逻辑:

private void DoubleClickEffect_DoubleTap(object sender, EventArgs e)
{
    // 双击逻辑
    DisplayAlert("提示", "触发双击", "确定");
}

private void DoubleClickEffect_SingleTap(object sender, EventArgs e)
{
    // 单击逻辑
    DisplayAlert("提示", "触发单击", "确定");
}

内容的提问来源于stack exchange,提问作者Bernd Morgeneyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:35