TabbedPage 中 ListView 中的 Xamarin Forms Slider 无法正确滑动

Xamarin Forms Slider in ListView in TabbedPage not sliding correctly

我有一个 DataTemplate,它将滑块放在 TabbedPage 的 ListView 中。在 Android 上,滑块无法正确移动,从左向右滑动会激活 TabbedPage 滑动功能。如果滑块在 ListView 之外,它可以正常工作。如何防止滑块的父控件处理拖动手势?

ViewParent.requestDisallowInterceptTouchEvent(boolean) 方法可能会有帮助,但我应该使用哪个渲染器等?

Video of issue with the slider

创建一个SliderRenderer,然后在DispatchTouchEvent(MotionEvent e)中调用RequestDisallowInterceptTouchEvent(boolean),就可以解决这个问题,这里是我的代码:

MainPage:

        var tabsXaml = new TabbedPage { Title = "Working with ListView" };
        tabsXaml.Children.Add(new BasicListXaml { Title = "Basic", Icon = "icon.png" } );
        tabsXaml.Children.Add(new JustView { Title = "JustView", Icon = "icon.png" });
        tabsXaml.Children.Add(new UnevenRowsXaml { Title = "UnevenX", Icon = "icon.png" });
        tabsXaml.Children.Add(new SliderPage { Title = "SliderPage", Icon = "icon.png" });
        MainPage = tabsXaml;

TabbedPage中的第二页:

<ContentPage.Content>
    <local:MyListView x:Name="listView" ItemSelected="OnItemSelected">
        <local:MyListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout>
                        <local:MySlider HorizontalOptions="Fill"/>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </local:MyListView.ItemTemplate>
    </local:MyListView>
</ContentPage.Content>

SlidererRenderer:

   public override bool DispatchTouchEvent(MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);                    
                break;
            case MotionEventActions.Move:
                 //This is the core of the problem!!!
                Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
                break;
            case MotionEventActions.Up:
                break;
            default:
                break;
        }
        return base.DispatchTouchEvent(e);
    }

您必须调用 RequestDisallowInterceptTouchEvent(true) 方法。 Parent.Parent.Parent.Parent.Parent.Parent.Parent在我的代码中表示Xamarin.Forms.Platform.Android.PageRendererSlider不能在中正常工作的原因是page(在我的代码中是JustView ) 阻止滑块处理拖动手势。

我的回答基于York Shen提供的解决方案。我不喜欢父嵌套是硬编码的方式,所以我只是添加了一个函数来帮助找到我们想要调用的渲染器 RequestDisallowInterceptTouchEvent。我的 Slider 嵌套在另一个视图中,这意味着我需要一个不同级别的父视图。所以给你:

public override bool DispatchTouchEvent(MotionEvent e)
{
    switch (e.Action)
    {
        case MotionEventActions.Down:
            (_navigationPage ??= GetNavigationPage(Parent)).RequestDisallowInterceptTouchEvent(true);
            break;
        case MotionEventActions.Move:
            //This is the core of the problem!!!
            _navigationPage.RequestDisallowInterceptTouchEvent(true);
            break;
        case MotionEventActions.Up:
            break;
        default:
            break;
    }
    return base.DispatchTouchEvent(e);
}

private IViewParent _navigationPage;

private IViewParent GetNavigationPage(IViewParent parent)
{
    if (parent is NavigationPageRenderer)
        return parent;
    return GetNavigationPage(parent.Parent);
}