防止滑动手势传播到 .NET MAUI 中的父控件上?

问题描述 投票:0回答:1

有没有办法防止滑动手势从 .NET MAUI 中的控件传播到其父控件?

对于这个项目,我在

DXRangeSlider
中使用
TabView
。两者都是由 DevExpress 创建的免费 MAUI 控件(在撰写本文时)。尽管如此,任何定义为选项卡视图内容的可滑动控件都会导致此问题。

TabView.SwipeEnabled = True
时,您可以在选项卡内容上向左或向右滑动以导航到序列中的上一个或下一个选项卡。当任何选项卡内容包含可滑动控件或具有滑动手势识别器的控件时,如果不调用选项卡滑动操作,则无法滑动这些控件。

当滑动手势针对子控件时,我希望

TabView
忽略我的滑动手势。

有什么办法可以实现这个目标吗?

XAML 设置并不复杂:

<dxcontrols:TabView>
    <dxcontrols:TabViewItem>
        ...
    </dxcontrols:TabViewItem>
    <!-- Parent swipable control: -->
    <dxcontrols:TabViewItem>
        ...
        <!-- Child swipable control: -->
        <dxeditors:DXRangeSlider/>
        ...
    </dxcontrols:TabViewItem>
    <dxcontrols:TabViewItem>
        ...
    </dxcontrols:TabViewItem>
</dxcontrols:TabView>

我相信在使用 MAUI

Slider
或启用了滑动功能的
CarouselView
中带有滑动手势识别器的任何控件时,也会存在同样的问题。没有测试过这个。

xaml maui swipe stoppropagation
1个回答
0
投票

我相信在启用了滑动功能的 CarouselView 中使用 MAUI 滑块或带有滑动手势识别器的任何控件时,也会存在同样的问题。

是的,有同样的问题。我可以通过为 Android 本机视图添加

IOnTouchListener
来解决它。并防止将滑动事件从子视图传递到父视图。

听众:

    public class SliderListener : Java.Lang.Object, IOnTouchListener
    {
        public bool OnTouch(global::Android.Views.View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down || e.Action == MotionEventActions.Move)
            {
                v.Parent.RequestDisallowInterceptTouchEvent(true);
                // prevent the parent view get the swipe event
            }
            else
            {
                v.Parent.RequestDisallowInterceptTouchEvent(false);
            }
            return false;
        }
    }

然后您可以在后面的代码或自定义处理程序中为滑块添加

Listener

1。在后面的代码中:滑块在 xaml 中有一个名称,例如:

<Slider x:Name="slider">
。在后面的代码中:

protected override void OnHandlerChanged()
        {
            base.OnHandlerChanged();
#if ANDROID
            (slider.Handler.PlatformView as Android.Widget.Seekbar)
                     .SetOnTouchListener(new SliderListener());
#endif
        }

2。在自定义handler中设置:可以参考官方文档使用handler自定义控件。并在 Custom Handler's

ConnectHandler
方法中执行此操作。

protected override void ConnectHandler(SeekBar platformView)
{
    base.ConnectHandler(platformView);
    platformView.SetOnTouchListener(new SliderListener());
}

您可以检查有关

DXRangeSlider
的源代码或仅调试以获取平台视图。然后用同样的方法解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.